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\n",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\n",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\n",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

 

posted @ 2018-09-08 07:46  啊宸  阅读(172)  评论(0编辑  收藏  举报