• 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
  • 相关阅读:
    CF1359D Yet Another Yet Another Task
    【数据结构】fhq_treap
    AtCoder Beginner Contest 182 题解
    UVA11992 Fast Matrix Operations
    双指针例题
    python使用国内镜像库
    APP元素定位工具之——Weditor
    安卓ADB的常见命令的使用
    函数进阶之迭代器,递归
    函数基础之对象,嵌套,名称空间和作用域
  • 原文地址:https://www.cnblogs.com/Accpted/p/11246042.html
Copyright © 2020-2023  润新知