2018杭電多校第三場(2018 Multi-University Training Contest 3)
阿新 • • 發佈:2019-01-25
2018 Multi-University Training Contest 3
A題題解:每次取長度為m的子區間,找最大值和起點的最長遞增序列。很明顯是一個滑塊區間維護最大值問題,但是正向維護很難處理count的問題,那麼從後往前單調佇列,那麼對於每個點的count就是當前單調佇列的大小。
AC程式碼:
#include <bits/stdc++.h> using namespace std; #define _for(i,a,b) for(int i=a;i<=b;i++) const int maxn = 1e7+7; long long p,q,r,mod,a[maxn]; int ans[maxn],sum[maxn]; int t,n,m,k; deque<int> Q; int main(int argc, char const *argv[]) { scanf("%d",&t); while(t--) { while(!Q.empty())Q.pop_back(); scanf("%d%d%d%ld%ld%ld%ld",&n,&m,&k,&p,&q,&r,&mod); _for(i,1,k) { scanf("%ld",&a[i]); } _for(i,k+1,n)a[i]=(p*a[i-1]+q*i+r)%mod; for(int i=n;i>=1;i--) { while(!Q.empty()&&a[i]>=a[Q.back()]) { Q.pop_back(); } Q.push_back(i); while(Q.front()-Q.back()+1>m)Q.pop_front(); sum[i]=Q.size(); ans[i]=a[Q.front()]; } //_for(i,1,n)cout<<sum[i]<<" "<<ans[i]<<endl; long long ans1 = 0; long long ans2 = 0; _for(i,1,n-m+1) { ans1+=sum[i]^i; ans2+=ans[i]^i; } cout<<ans2<<" "<<ans1<<endl; } return 0; }
F題題解:所有值異或之後為0說明Q怎麼取對面都是取到一個相等的值,此時平局。否則很明顯Q先手可以達到必勝的結果。
AC程式碼:
#include <bits/stdc++.h> using namespace std; #define _for(i,a,b) for(int i=a;i<=b;i++) const int maxn = 1e5+7; int t,n,m,a[maxn]; int main(int argc, char const *argv[]) { scanf("%d",&t); while(t--) { scanf("%d",&n); _for(i,1,n)scanf("%d",&a[i]); _for(i,1,n-1) { int x,y; scanf("%d%d",&x,&y); } int ans = 0; _for(i,1,n)ans = ans^a[i]; if(ans==0)cout<<"D"<<endl; else cout<<"Q"<<endl; } return 0; }
L題題解:隨便模擬即可。
AC程式碼:
#include <bits/stdc++.h> using namespace std; #define _for(i,a,b) for(int i=a;i<=b;i++) int t,n,as,b,c; char a[2500][2500]; int main(int argc, char const *argv[]) { cin>>t; while(t--) { cin>>as>>b>>c; int k = 2*b+1; int s = 2*as+1; int h = c*2+1; _for(i,1,k) { _for(j,1,k-i)a[i][j]='.'; if(i&1) { _for(j,k-i+1,k-i+s) { if(j&1)a[i][j]='+'; else a[i][j]='-'; } _for(j,k-i+s+1,k-1+s) { if(j&1)a[i][j]='+'; else a[i][j]='.'; } } else { _for(j,k-i+1,k-i+s) { if(j&1)a[i][j]='.'; else a[i][j]='/'; } _for(j,k-i+s+1,k-1+s) { if(j&1)a[i][j]='|'; else a[i][j]='/'; } } } _for(i,1,h) { _for(j,1,s) { if(i&1) { if(j&1)a[i+k][j]='|'; else a[i+k][j]='.'; } else { if(j&1)a[i+k][j]='+'; else a[i+k][j]='-'; } } _for(j,1,k-1) { if(i&1) { if(j&1)a[i+k][j+s]='/'; else a[i+k][j+s]='|'; } else { if(j&1)a[i+k][j+s]='.'; else a[i+k][j+s]='+'; } } } for(int i=1;i<=k-1;i++) { _for(j,1,k-i) { a[k+h-i][s+k-j]='.'; } } _for(i,1,k+h-1) { _for(j,1,k+s-1)cout<<a[i][j]; cout<<endl; } } return 0; }