码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #291 Div2

时间:2015-02-15 21:55:00      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

A. Chewbaсca and Number

签到题

//#pragma comment(linker, "/STACK:102400000,102400000") 手动扩栈
#include<iostream>
#include<algorithm>
#include <queue>
#include<stack>
#include<map>
#include<string>
#include<set>
#include<vector>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define N 100
char s[N];
int main()
{
    int n,m;
    cin>>s;
    int len = strlen(s);
    for(int i=0;i<len;i++)
    {
        if(i==0&&s[i]=='9') continue;
        if(s[i] > '9'-s[i]+'0') s[i]='9'-s[i]+'0';
        //printf("%c %c\n",s[i],)
    }
    cout<<s<<endl;
    return 0;
}

B. Han Solo and Lazer Gun

注意精度

#include<iostream>
#include<algorithm>
#include <queue>
#include<stack>
#include<map>
#include<string>
#include<set>
#include<vector>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define mem(a) memset(a,0,sizeof(a))
#define ok1 printf("ok1\n");
#define ok2 printf("ok2\n");
#define orz printf("orz...\n");
#define eps 1e-6
#define PI acos(-1.0)
#define N 1000+10
set<int> s;
set<int> de;
set<int>::iterator it;
double x[N],y[N];
int cmp(double x)
{
    if(  fabs(x) < eps) return 1;
    return 0;
}
int main()
{
    int n;
    double tx,ty;
    double ttx,tty;
    s.clear();
    cin>>n>>x[0]>>y[0];
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&x[i],&y[i]);
        s.insert(i);
    }
    int ans= 0 ;
    while(!s.empty())
    {
        de.clear();
        it = s.begin();
        ans++;
        tx = x[*it]; ty = y[*it];
        for(;it!=s.end();it++)
        {
            ttx = x[*it]; tty=y[*it];
            if(cmp( (ty-y[0])*(ttx-tx)-(tty-ty)*(tx-x[0]) ) )
               de.insert(*it);
        }
        for(it=de.begin();it!=de.end();it++)
            s.erase(*it);
    }
    cout<<ans<<endl;

    return 0;
}

C. Watto and Mechanism

Trie树 + dfs搜索

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 6*100000+10;
const int maxnode = 6*100000+10;
const int sigma_size = 4;
int len;
char s[N];
struct Trie
{
    int ch[maxnode][sigma_size];
    int val[maxnode];
    int sz;
    Trie() {sz=1;memset(ch[0],0,sizeof(ch[0])); }
    int idx(char x) {return x-'a';}

    void insert(char *s,int v) // v is the value of s
    {
        int u = 0,n = strlen(s);
        for(int i=0;i<n;i++)
        {
            int c = idx(s[i]);
            if(!ch[u][c])
            {
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz] = 0;
                ch[u][c] = sz++;
            }
            u = ch[u][c];
        }
        val[u] = v;
    }
};
Trie t;
int dfs(char *s,int u,int id,int f)
{
    if(id==len)
    {
        if(f==1 && t.val[u]) return 1;
        return 0;
    }
    //cout<<id<<" f="<<f<<"\n";
    int c = t.idx(s[id]);
    int c1 = (c+1)%3;
    int c2 = (c+2)%3;
    //cout<<"i'm checking "<<c<<" "<<t.ch[u][c]<<endl;
    if(t.ch[u][c] && dfs(s,t.ch[u][c],id+1,f)) return 1;
    if(t.ch[u][c1] && f==0 && dfs(s,t.ch[u][c1],id+1,1) ) return 1;
    if(t.ch[u][c2] && f==0 && dfs(s,t.ch[u][c2],id+1,1) ) return 1;
    //cout<<"over in "<<id<<endl;
    return 0;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",s);
        t.insert(s,1);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%s",s);
        len = strlen(s);
        if( dfs(s,0,0,0)==1 ) puts("YES");
        else puts("NO");
    }
    return 0;
}

D. R2D2 and Droid Army

RMQ_ST + 维护一个连续区间(队列)

//#pragma comment(linker, "/STACK:102400000,102400000") 手动扩栈
#include<iostream>
#include<algorithm>
#include <queue>
#include<stack>
#include<map>
#include<string>
#include<set>
#include<vector>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define INF 2000000002
#define pow(a,b,c,d) (a-c)*(a-c)+(b-d)*(b-d)
#define swap(a,b) (a^=b,b^=a,a^=b)
#define sca(a) scanf("%d",&a)
#define mem(a) memset(a,0,sizeof(a))
#define ok1 printf("ok1\n");
#define ok2 printf("ok2\n");
#define orz printf("orz...\n");
#define eps 1e-8
#define PI acos(-1.0)
//求区间最值问题(原数值不改变)
const int N = 100000+10;
const int M = 100 ;
int n,m;
int a[6][N];
int dp[6][N][M]; // dp[i][j] 为从 i 开始 ,长度为 2^j 的区间内 最值
long long ans[6];
void RMQ_init()
{
    for(int k=1;k<=m;k++){
    for(int i=1;i<=n;i++) dp[k][i][0] = a[k][i];
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1; i+(1<<j)-1<=n ;i++)
            dp[k][i][j] = max(dp[k][i][j-1],dp[k][i+(1<<(j-1))][j-1]);
    }
}
int RMQ_ST(int kk,int l,int r)
{
    int k = 0;
    while( (1<<(k+1)) <= r-l+1 ) k++;
    return max(dp[kk][l][k],dp[kk][r-(1<<k)+1][k]);
}
int main()
{
    long long k;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&a[j][i]);
    RMQ_init();
    int l=1,r=1;
    int sans=-1;
    memset(ans,0,sizeof(ans));
    while(r<=n)
    {
        int sum=0;
        for(int i=1;i<=m;i++){
            sum+=RMQ_ST(i,l,r);
        }
        if(sum > k){
            l++;
            while(r<l) r++;
        }
        else{
            if(r-l+1 >= sans){
                for(int i=1;i<=m;i++)
                    ans[i]=RMQ_ST(i,l,r);
                sans = max(sans,r-l+1);
            }
            r++;
        }
    }
    int ss=0;
    for(int i=1;i<=m-1;i++){
        cout<<ans[i]<<" ";
        ss+=ans[i];
    }
    cout<<ans[m];
    cout<<endl;
    return 0;
}


Codeforces Round #291 Div2

标签:

原文地址:http://blog.csdn.net/alpc_wt/article/details/43836931

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!