2019牛客暑期多校训练营(第三场)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N=100101;
 5 int n,pre[N],num0,num1,a[N*3],ans;
 6 char c[N];
 7 int main(){
 8     scanf("%d",&n);
 9     scanf("%s",c);
10     for (int i=0;i<n;i++){
11         if (c[i]=='0'){
12             num0++;
13             pre[i]=pre[i-1]+1;
14             if (a[pre[i]+N]==0){
15                 a[pre[i]+N]=i;
16             }else{
17                 ans=max(ans,i-a[pre[i]+N]);
18             }
19         }
20         if (c[i]=='1'){
21             num1++;
22             pre[i]=pre[i-1]-1;
23             if (a[pre[i]+N]==0){
24                 a[pre[i]+N]=i;
25             }else{
26                 ans=max(ans,i-a[pre[i]+N]);
27             }
28         }
29         if (pre[i]==0){
30             ans=max(ans,i+1);
31         }
32     }
33     printf("%d %d
",ans,2*min(num0,num1));
34 }
View Code

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn=1e3+10;
 6 const int inf=0x3f3f3f3f;
 7 int mx[maxn],mi[maxn],a[maxn][maxn];
 8 int n,m,q[maxn][2];
 9 int main() {
10     int t;
11     scanf("%d", &t);
12     while (t--) {
13         scanf("%d%d", &n, &m);
14         for (int i = 1; i <= n; i++) {
15             for (int j = 1; j <= n; j++) {
16                 scanf("%d", &a[i][j]);
17             }
18         }
19         int ans = 0;
20         for (int i = 1; i <= n; i++) {
21             for (int j = 1; j <= n; j++) {
22                 mx[j] = 0;
23                 mi[j] = inf;
24             }
25             for (int j = i; j <= n; j++) {
26                 int t1 = 0, t2 = 0, l = 1, l2 = 1, l1 = 1;
27                 for (int k = 1; k <= n; k++) {
28                     mx[k] = max(mx[k], a[j][k]);
29                     mi[k] = min(mi[k], a[j][k]);
30                     while (t1 >= l1 && mx[q[t1][0]] <= mx[k]) t1--;
31                     while (t2 >= l2 && mi[q[t2][1]] >= mi[k]) t2--;
32                     q[++t1][0] = k;
33                     q[++t2][1] = k;
34                     while (k >= l && mx[q[l1][0]] - mi[q[l2][1]] > m) {
35                         l++;
36                         if (q[l1][0] < l) {
37                             l1++;
38                         }
39                         if (q[l2][1] < l) {
40                             l2++;
41                         }
42                     }
43                     ans = max(ans, (k - l + 1) * (j - i + 1));
44                 }
45             }
46         }
47         printf("%d
", ans);
48     }
49 }
View Code

  1 /*
  2 
  3 
  4 // manacher ,后缎自动机,回文自 动机,字符串hash
  5 
  6 //==========================
  7 //manacher 求最长回文子串
  8 //==========================
  9 const int maxn=110010;
 10 char ma[maxn*2];
 11 int mp[maxn*2];
 12 void manacher(char s[],int len) {
 13     int l = 0;
 14     ma[l++] = '$';
 15     ma[l++] = '#';
 16     for (int i = 0; i < len; i++) {
 17         ma[l++] = s[i];
 18         ma[l++] = '#';
 19     }
 20     ma[l] = 0;
 21     int mx = 0, id = 0;
 22     for (int i = 0; i < l; i++) {
 23         mp[i] = mx > i ? min(mp[2 * id - i], mx - i) : 1;
 24         while (ma[i + mp[i]] == ma[i - mp[i]]) {
 25             mp[i]++;
 26         }
 27         if (i + mp[i] > mx) {
 28             mx = i + mp[i];
 29             id = i;
 30         }
 31     }
 32 }
 33 
 34 char s[maxn];
 35 int main(){
 36     while (~scanf("%s",s)){
 37         int len=strlen(s);
 38         manacher(s,len);
 39         int ans=0;
 40         for (int i=0;i<len*2+2;i++){
 41             ans=max(ans,mp[i]-1)
 42         }
 43         printf("%d
",ans);
 44     }
 45 }
 46 
 47 //=======================
 48 // AC自动机 HDU2222
 49 // 求目标串中出现了几个模式串
 50 //=======================
 51 
 52 struct Trie{
 53     int next[maxn][26],fail[maxn],end[maxn];
 54     int root,l;
 55     int newnode(){
 56         for (int i=0;i<26;i++){
 57             next[i]=-1;
 58         }
 59         end[l++]=0;
 60         return l-1;
 61     }
 62     void init(){
 63         l=0;
 64         root=newnode();
 65     }
 66     void insert(char buf[]){
 67         int len=strlen(buf);
 68         int now=root;
 69         for (int i=0;i<len;i++){
 70             if (next[now][buf[i]-'a']==-1){
 71                 next[now][buf[i]-'a']=newnode();
 72             }
 73             now=next[now][buf[i]-'a'];
 74         }
 75         end[now]++;
 76     }
 77     void build(){
 78         queue<int>Q;
 79     }
 80 
 81 };
 82 
 83 
 84 */
 85 
 86 
 87 
 88 
 89 
 90 
 91 
 92 
 93 #include<bits/stdc++.h>
 94 using namespace std;
 95 const int N=100000;
 96 struct node{
 97     int x,y;
 98     bool operator<(const node &b)const {
 99         if (x==b.x){
100             return y>b.y;
101         }else{
102             return x<b.x;
103         }
104     }
105 }a[N];
106 int n;
107 int main(){
108     int t;
109     scanf("%d",&t);
110     while (t--) {
111         scanf("%d", &n);
112         for (int i = 1; i <= n; i++) {
113             scanf("%d%d", &a[i].x, &a[i].y);
114         }
115         sort(a + 1, a + n + 1);
116         int ans1x = a[n / 2].x + 1;
117         int ans2x = a[n / 2 + 1].x - 1;
118         int ans1y = a[n / 2].y + 999000000;
119         int ans2y = a[n / 2 + 1].y - 999000000;
120         printf("%d %d %d %d
", ans1x, ans1y, ans2x, ans2y);
121 
122 
123     }
124 }
View Code

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 const int N=3e5+10;
 5 long long ans;
 6 int t,n,a[N];
 7 int main()
 8 {
 9     scanf("%d",&t);
10     while (t--)
11     {
12         scanf("%d",&n);
13         for (int i=1; i<=n; i++)
14         {
15             scanf("%d",&a[i]);
16         }
17         ans=0;
18         for (int i=1; i<=n; i++)
19         {
20             int l=i,r=i;
21             long long sum=0;
22             while (l>1&&sum+a[l-1]<a[i])
23             {
24                 l--;
25                 sum+=a[l];
26 
27             }
28             while (r<n&&sum+a[r+1]<a[i])
29             {
30                 r++;
31                 sum+=a[r];
32 
33             }
34             ans+=r-i+1;
35             for (int j=l; j<i; j++)
36             {
37                 sum-=a[j];
38                 while (r<n&&sum+a[r+1]<a[i])
39                 {
40                     r++;
41                     sum+=a[r];
42                 }
43                 ans+=r-i+1;
44             }
45         }
46         printf("%lld
",(long long)n*(n+1)/2-ans);
47     }
48 }
View Code
原文地址:https://www.cnblogs.com/Accpted/p/11246042.html