Codeforces Round #707

A:模拟题,每次进站加上应该要的时间和延迟的时间

 每次等待的时候需要题给定的两个条件都满足。

 注意:最后一站不需要等待,所以需要单独考虑。

 1 #include<cstring>
 2 #include<algorithm>
 3 #include<iostream>
 4 using namespace std;
 5 const int N=110;
 6 int a[N],b[N],tm[N];
 7 int main(void){
 8     int t;
 9     cin>>t;
10     while(t--){
11         int n;
12         cin>>n;
13         for(int i=1;i<=n;i++){
14             cin>>a[i]>>b[i];
15         }
16         for(int i=1;i<=n;i++){
17             cin>>tm[i];
18         }
19         int res=0;
20         for(int i=1;i<n;i++){
21             //进站
22             res=res+a[i]-b[i-1]+tm[i];
23             //等待
24             res+=(b[i]-a[i]+1)/2;
25             if(res<b[i]) res=b[i];
26         }
27         res=res+a[n]-b[n-1]+tm[n];
28         cout<<res<<endl;
29     }
30     return 0;
31 }

B:常规差分问题。

 1 #include<cstring>
 2 #include<algorithm>
 3 #include<iostream>
 4 using namespace std;
 5 const int N=2e5+10;
 6 int res[N];
 7 int main(void){
 8     int t;
 9     cin>>t;
10     while(t--){
11         memset(res,0,sizeof(res));
12         int n;
13         cin>>n;
14         for(int i=1;i<=n;i++){
15             int q;
16             cin>>q;
17             int t=max(0,i-q+1);
18             res[t]+=1;
19             res[i+1]-=1;
20         }
21         for(int i=1;i<=n;i++){
22             res[i]+=res[i-1];
23             if(res[i]>0) cout<<1<<" ";
24             else cout<<0<<" ";
25         }
26         cout<<endl;
27     }
28     return 0;
29 }

C:必须参照区间DP的枚举方法,枚举线段长度和起点,不然会被一个全1的数据卡。(其实具体的我也不明白)

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 const int N=2e5+10;
 5 const int M=5e6+10;
 6 typedef pair<int,int> PII;
 7 vector<PII> v[M];
 8 int a[N];
 9 int main(void){
10     int n;
11     cin>>n;
12     for(int i=1;i<=n;i++) cin>>a[i];
13     for(int i=1;i<=n;i++){
14         for(int j=1;i+j<=n;j++){
15             int t=a[i+j]+a[j];
16             for(auto x:v[t]){
17                 if(x.first!=i+j&&x.first!=j&&x.second!=i+j&&x.second!=j){
18                     puts("YES");
19                     printf("%d %d %d %d
",i+j,j,x.first,x.second);
20                     return 0;
21                 }
22             }
23             v[t].push_back({i+j,j});
24         }
25     }
26     puts("NO");
27     return 0;
28 }
原文地址:https://www.cnblogs.com/greenofyu/p/14534750.html