zoukankan      html  css  js  c++  java
  • NOIp2018集训test-9-6(pm)

    T1T2是洛谷原题。Orz辉神290,被辉神吊起来打。

    题 1 包裹快递

    二分答案。这题似乎卡精度,不开long double二分500次都过不去。

     1 //Achen
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdlib>
     6 #include<vector>
     7 #include<cstdio>
     8 #include<queue>
     9 #include<cmath>
    10 #include<set>
    11 #include<map>
    12 #define Formylove return 0
    13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
    14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
    15 const int N=200007;
    16 typedef long long LL;
    17 typedef long double db;
    18 using namespace std;
    19 int n,x[N],y[N],s[N];
    20 
    21 template<typename T>void read(T &x)  {
    22     char ch=getchar(); x=0; T f=1;
    23     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    24     if(ch=='-') f=-1,ch=getchar();
    25     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    26 }
    27 
    28 int ck(db v) {
    29     if(v==0.0) return 0;
    30     db now=0.0;
    31     For(i,1,n) {
    32         db ti=((db)s[i])/(1.0*v);
    33         if(now+ti>(db)y[i]) return 0;
    34         now=max(now+ti,(db)x[i]);
    35     }
    36     return 1;
    37 }
    38 
    39 #define ANS
    40 int main() {
    41 #ifdef ANS
    42     freopen("express.in","r",stdin);
    43     freopen("express.out","w",stdout);
    44 #endif
    45     read(n);
    46     For(i,1,n) {
    47         read(x[i]); read(y[i]); read(s[i]);
    48     }
    49     db l=0.0,r=1e7;
    50     int cnt=0;
    51     while(cnt<50) {
    52         cnt++;
    53         db mid=((l+r)/2.0);
    54         if(ck(mid)) r=mid;
    55         else l=mid;
    56     }
    57     printf("%.2Lf
    ",l);
    58     Formylove;
    59 }
    60 /*
    61 3
    62 1 2 2
    63 6 6 2
    64 7 8 4
    65 */
    View Code

    题 2 迎接仪式

    状态定义写代码里了,比较蠢的dp,但是当时我把自己蠢哭了,只考虑了这样换((()))没考虑这样换(())(())(),写了个奇奇怪怪的dp,然后只有50

    //Achen
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<vector>
    #include<cstdio>
    #include<queue>
    #include<cmath>
    #include<set>
    #include<map>
    #define Formylove return 0
    #define For(i,a,b) for(int i=(a);i<=(b);i++)
    #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
    const int N=507;
    typedef long long LL;
    typedef double db;
    using namespace std;
    int f[2][205][205][2],a[N],n,K,ans;
    char s[N];
    
    template<typename T>void read(T &x)  {
        char ch=getchar(); x=0; T f=1;
        while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
        if(ch=='-') f=-1,ch=getchar();
        for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    }
    
    void get_max(int &a,int b) { if(b>a) a=b; }
    
    #define ANS
    int main() {
    #ifdef ANS
        freopen("welcome.in","r",stdin);
        freopen("welcome.out","w",stdout);
    #endif
        read(n); read(K);
        scanf("%s",s+1);
        For(i,1,n) {
            if(s[i]=='j') a[i]=1;
            else a[i]=0;
        }
        memset(f,128,sizeof(f));
        int inf=f[0][0][0][0],o=0;
        f[o][0][0][0]=0; //f[i][j][k][l] 前i个数换了j次,有k次是1,第i个数换没有 
        For(i,1,n) {
            o^=1;
            memset(f[o],128,sizeof(f[o]));
            For(j,0,K*2) For(k,0,K) For(l,0,1) if(f[o^1][j][k][l]!=inf) {
                get_max(f[o][j][k][0],f[o^1][j][k][l]+((i>1)&&(a[i-1]^l)&&!a[i]));
                get_max(f[o][j+1][k+a[i]][1],f[o^1][j][k][l]+((i>1)&&(a[i-1]^l)&&a[i]));
            }
        }
        For(i,0,K) {
            get_max(ans,f[o][i*2][i][0]);
            get_max(ans,f[o][i*2][i][1]);
        }
        printf("%d
    ",ans);
        Formylove;
    }
    View Code

    题 3 与众不同

    从后往前扫一遍就可以知道每个数开头的连续的互不相同的序列的长度,n^2做法就每个询问挨着枚举开头,长度和当前结尾减开头+1取min。

    去掉取min的过程就可以线段树了,发现对于一个数,完美序列包涵它的开头是一段连续区间,预处理出最靠前的位置,询问离线下来按结尾排序,每次把当前结尾之外的点的包涵它的开头的区间长度-1即可。

      1 //Achen
      2 #include<algorithm>
      3 #include<iostream>
      4 #include<cstring>
      5 #include<cstdlib>
      6 #include<vector>
      7 #include<cstdio>
      8 #include<queue>
      9 #include<cmath>
     10 #include<set>
     11 #include<map>
     12 #define Formylove return 0
     13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
     14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
     15 const int N=200007; 
     16 typedef long long LL;
     17 typedef double db;
     18 using namespace std;
     19 int n,m,a[N],b[N],ls[N],sz,f[N],r[N],l[N],ans[N];
     20 
     21 template<typename T>void read(T &x)  {
     22     char ch=getchar(); x=0; T f=1;
     23     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
     24     if(ch=='-') f=-1,ch=getchar();
     25     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
     26 }
     27 
     28 #define lc (x<<1)
     29 #define rc ((x<<1)|1)
     30 #define mid ((l+r)>>1)
     31 int sg[N<<2],lz[N<<2];
     32 void down(int x,int l,int r) {
     33     if(!lz[x]) return;
     34     sg[lc]+=lz[x]; sg[rc]+=lz[x];
     35     lz[lc]+=lz[x]; lz[rc]+=lz[x];
     36     lz[x]=0;
     37 }
     38 
     39 void update(int x,int l,int r,int ql,int qr,int v) {
     40     if(l>=ql&&r<=qr) {
     41         sg[x]+=v; lz[x]+=v; return;
     42     }
     43     down(x,l,r);
     44     if(ql<=mid) update(lc,l,mid,ql,qr,v);
     45     if(qr>mid) update(rc,mid+1,r,ql,qr,v);
     46     sg[x]=max(sg[lc],sg[rc]); 
     47 } 
     48 
     49 int qry(int x,int l,int r,int ql,int qr) {
     50     if(l>=ql&&r<=qr) return sg[x];
     51     down(x,l,r);
     52     if(qr<=mid) return qry(lc,l,mid,ql,qr);
     53     if(ql>mid) return qry(rc,mid+1,r,ql,qr);
     54     return max(qry(lc,l,mid,ql,qr),qry(rc,mid+1,r,ql,qr));
     55 }
     56 
     57 struct node {
     58     int id,l,r;
     59 }qs[N];
     60 vector<node>vc[N];
     61 
     62 #define ANS
     63 int main() {
     64 #ifdef ANS
     65     freopen("diff.in","r",stdin);
     66     freopen("diff.out","w",stdout);
     67 #endif
     68     read(n); read(m);
     69     For(i,1,n) read(a[i]),b[i]=a[i];
     70     sort(b+1,b+n+1);
     71     sz=unique(b+1,b+n+1)-(b+1);
     72     For(i,1,n) a[i]=lower_bound(b+1,b+sz+1,a[i])-b;
     73     Rep(i,n,1) {
     74         f[i]=f[i+1]+1;
     75         if(!r[i+1]) r[i]=i;
     76         else r[i]=r[i+1];
     77         if(ls[a[i]]) {
     78             if(ls[a[i]]-1<r[i]) r[i]=ls[a[i]]-1;
     79             f[i]=min(f[i],ls[a[i]]-i);
     80         }
     81         update(1,1,n,i,i,f[i]);
     82         ls[a[i]]=i;
     83     }
     84     For(i,1,n) l[i]=i; 
     85     For(i,1,n) l[r[i]]=min(l[r[i]],i);
     86     Rep(i,n-1,1) l[i]=min(l[i],l[i+1]);
     87     For(i,1,m) {
     88         int l,r;
     89         read(l); read(r);
     90         l++; r++; 
     91         qs[i].l=l; qs[i].r=r;
     92         qs[i].id=i;
     93         vc[qs[i].r].push_back(qs[i]);
     94     }
     95     Rep(i,n,1) {
     96         int upp=vc[i].size();
     97         For(j,0,upp-1) {
     98             node q=vc[i][j];
     99             ans[q.id]=qry(1,1,n,q.l,q.r);
    100         }
    101         if(l[i]<=i)
    102             update(1,1,n,l[i],i,-1);
    103     }
    104     For(i,1,m) printf("%d
    ",ans[i]);
    105     Formylove;
    106 }
    107 /*
    108 9 2
    109 2 5 4 1 2 3 6 2 4
    110 0 8
    111 2 6
    112 */
    View Code
  • 相关阅读:
    Java--笔记(4)
    Java--笔记(3)
    Java--笔记(2)
    Java--笔记(1)
    Java--剑指offer(10)
    Java--剑指offer(9)
    网络基础面试常考知识点
    Java--剑指offer(8)
    Keil C51 的printf
    C语言中以十六进制输出字符型变量会出现'ffffff"的问题
  • 原文地址:https://www.cnblogs.com/Achenchen/p/9607808.html
Copyright © 2011-2022 走看看