2016 ICPC 北京网络赛 A 恶心模拟 F 循环矩阵,FFT(待补) I 模拟

2016 ICPC 北京网络赛     

A - The Book List

题意:每本书有所属种类,给出原生的存放方式,求按新的方式存放的样子。

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;
}
View Code

F - Periodic Signal

题意:给出A[],B[]数组,求

tags:化简一下,就是求 max(A[i]*B[(i+k)%n], i=0~n-1) ,k=0~n-1。  然后就不知道了。。要用到FFT,试着学了一下,完全看不懂。

I - Countries

题意:两国打战。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;
}
View Code

 

posted @ 2017-04-17 21:35  v9fly  阅读(274)  评论(2编辑  收藏  举报