2016 ICPC 北京网络赛 A 恶心模拟 F 循环矩阵,FFT(待补) I 模拟
题意:每本书有所属种类,给出原生的存放方式,求按新的方式存放的样子。
tags:坑到心态爆炸的题== 直接堆进vector里搞的,不知道哪错了,待补 。 真的好题,好题.... 可参考 知乎讨论
坑点: 字典序, 空格, 书名可与种类名相同, 种类名要在书名前, '0'结束符, 种类名可以是'0', 书没有种类。
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<queue> #include<stack> #include<map> #include<bitset> #include<vector> #include<set> #include<list> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a;i<=b;i++) #define per(i,b,a) for (int i=b;i>=a;i--) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define PB push_back typedef long long ll; const int N = 200005; vector<string > ve[100]; string s1, s; char ch; int k=0, cas=1; void solve() { printf("Case %d:\n", cas++); sort(ve, ve+k); int sum=0; for(int j=0, sz=ve[0].size(); j<sz; j++) { rep(h,1,sum) putchar(' '); for(int h=1; ve[0][j][h]; h++) putchar(ve[0][j][h]); puts(""); sum+= 4; } rep(i,1,k-1) if(ve[i]!=ve[i-1]) { bool flag=0; sum=0; for(int j=0, sz=ve[i].size(); j<sz; j++) { if(j<ve[i-1].size() && ve[i][j]!=ve[i-1][j]) flag=1; if(flag==1) { rep(h,1,sum) putchar(' '); for(int h=1; ve[i][j][h]; h++) putchar(ve[i][j][h]); puts(""); } sum+= 4; } } k=0; rep(i,0,39) ve[i].clear(); } int main() { s=""; while(scanf("%c", &ch)!=EOF) { if(ch=='\n') { if(s.size()==1 && s=="0") { solve(); s=""; continue; } bool flag=0; for(int j=s.size()-1; j>=0; j--) if(s[j]=='/') { if(flag==0) s[j]=']', flag=1; else s[j]='['; } s1="["; if(flag==0) s1="]"; for(int j=0; s[j]; j++) { if(s[j]=='[' || s[j]==']') { ve[k].PB(s1); s1=""; } s1+=s[j]; } ve[k].PB(s1); s=""; k++; } else { s+=ch; } } return 0; } /* A1/B1 DF/B2/0B6/C5 A1/B1 DF/B2/B5/CC A1/B1/B2/B1 0 A1 AAAA 0 a/b/c a/b 0 c/b/v c/v 0 */
C - A Simple Job 水题,求出现次数最多的词组。
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<queue> #include<stack> #include<map> #include<bitset> #include<vector> #include<set> #include<list> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a;i<=b;i++) #define per(i,b,a) for (int i=b;i>=a;i--) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define fi first #define se second typedef long long ll; const int N = 200005; map<pair<string ,string >, int > mp; void solve() { int mx=0; string s1, s2; for(auto it=mp.begin(); it!=mp.end(); it++) { if(mx<(it->se)) mx=it->se, s1=it->fi.fi, s2=it->fi.se; } cout<<s1<<" "<<s2<<":"<<mx<<endl; } int main() { char ch; string s1="", s2=""; mp.clear(); bool flag=0; while(scanf("%c", &ch)!=EOF) { if(ch=='#' && flag==0) { solve(); s1="", s2=""; mp.clear(); flag=1; } else if(ch==',' || ch=='.' || ch=='\n') { if(s2!="" && s1!="") mp[MP(s2,s1)]++; s1="", s2=""; flag=0; } else if(ch==' ' && s1!="") { if(s2!="") mp[MP(s2,s1)]++; s2=s1, s1=""; } else if(ch<='z' && ch>='a') s1+=ch; } return 0; }
题意:给出A[],B[]数组,求
tags:化简一下,就是求 max(A[i]*B[(i+k)%n], i=0~n-1) ,k=0~n-1。 然后就不知道了。。要用到FFT,试着学了一下,完全看不懂。
题意:两国打战。A国发射N枚导弹,第 i 枚在Tai时向B国发射,中途飞行时间Taci,破坏范围dai;国家B发射M枚,其它相同。 A国防护系统持续时间Ta,B国持续时间Tb,且B在时间 x打开系统。问A在什么时间开启防护,可使A国遭受破坏范围最小。
tags:看着很复杂,其实就是xjb模拟,但要理清头绪。
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<queue> #include<stack> #include<map> #include<bitset> #include<vector> #include<set> #include<list> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a;i<=b;i++) #define per(i,b,a) for (int i=b;i>=a;i--) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 20005; ll ta, tb, xb, yb, ti, tci, dai, sum; int n, m; map<ll , ll > mp; void check(ll t1, ll t2, ll da) { ll s1, s2; if(yb<t1+t2 || t1+t2<xb) s1=t1-ta, s2=t1; else { s2=t1+t2+ ((yb-(t1+t2))/(2*t2))*(2*t2)+t2; s1=s2-ta, s2=t1; if(s1>t1) return ; } s1=max(0LL, s1); mp[s1]+=da, mp[s2+1]-=da; } void Init() { sum=0, yb=xb+tb; mp.clear(); } int main() { while(scanf("%lld %lld %lld %d %d", &ta, &tb, &xb, &n, &m)!=EOF) { Init(); rep(i,1,n) { scanf("%lld %lld %lld", &ti, &tci, &dai); if(ti+tci>=xb && ti+tci<=xb+tb) { sum+= dai; check(ti+2*tci, tci, dai); } } rep(i,1,m) { scanf("%lld %lld %lld", &ti, &tci, &dai); sum+= dai; check(ti+tci, tci, dai); } ll ans=1e18, sum1=0; for(auto it=mp.begin(); it!=mp.end(); it++) { sum1+= it->second; ans=min(ans, sum-sum1); } printf("%lld\n", ans); } return 0; }