2017-2-19四校联考

T1.

#include<cstdio>
#include<cstring>
#define MN 300
int a[MN+5][MN+5],f[2][1<<17];
int main()
{
    freopen("design.in","r",stdin);
    freopen("design.out","w",stdout);
    int n,m,p,i,j,k,x,p1,p2;
    scanf("%d%d%d",&n,&m,&p);
    for(i=1;i<=n;++i)for(j=1;j<=m;++j)scanf("%d",&(m>n?a[j][i]:a[i][j]));
    if(m>n)i=n,n=m,m=i;f[0][0]=1;
    for(i=p1=1,p2=0;i<=n+1;++i)for(j=1;j<=m;++j,p1^=1,p2^=1)
    {
        memset(f[p1],0,sizeof(f[p1]));
        for(k=0;k<1<<m;++k)
        {
            if(!a[i-1][j]&&(k&(1<<j-1)))continue;
            x=k^(a[i-1][j]<<j-1);
            if(!a[i][j]&&(x&(1<<j-1)))continue;
            f[p1][x]=(f[p1][x]+f[p2][k])%p;
            if(a[i][j]&&a[i][j-1]&&!(x&(1<<j-1))&&!(x&(1<<j-2)))
                x|=1<<j-1,x|=1<<j-2,f[p1][x]=(f[p1][x]+f[p2][k])%p;
        }
    }
    printf("%d",1ll*f[p2][0]*f[p2][0]%p);
    fclose(stdin);fclose(stdout);return 0;
}

T2.

#include<cstdio>
#include<algorithm>
using namespace std;
inline int read()
{
    int x=0;char c;
    while((c=getchar())<‘0‘||c>‘9‘);
    for(;c>=‘0‘&&c<=‘9‘;c=getchar())x=x*10+c-‘0‘;
    return x;
}
#define MN 200000
int n,L,a[MN+5],t[MN+5],q[MN+5];
struct P{int l,r;}p[MN+5];
bool cmp(P a,P b){return a.l==b.l?a.r>b.r:a.l<b.l;}
int c[MN+5][2],fa[MN+5],s[MN+5],tf[MN+5];
inline void update(int x){s[x]=s[c[x][0]]+s[c[x][1]]+1;}
void rotate(int x)
{
    int f=fa[x],ff=fa[f],l,r;
    l=c[f][1]==x;r=l^1;
    fa[f]=x;fa[x]=ff;fa[c[x][r]]=f;
    c[ff][c[ff][1]==f]=x;c[f][l]=c[x][r];c[x][r]=f;
    update(f);if(tf[f])tf[x]=tf[f],tf[f]=0;
}
void splay(int x)
{
    for(int f;fa[x];rotate(x))
        if(fa[f=fa[x]])rotate(c[fa[f]][0]==f^c[f][0]==x?x:f);
    update(x);
}
void access(int x)
{
    int f;
    for(splay(x);(f=tf[x])>0;splay(x))
    {
        splay(f);
        fa[c[f][1]]=0;tf[c[f][1]]=f;
        fa[c[f][1]=x]=f;tf[x]=0;
    }
}
int get(int x,int k)
{
    int l=1,r=n,mid,res=0;
    while(l<=r)
    {
        if(p[mid=l+r>>1].l>a[x])r=mid-1;
        else l=mid+1,res=mid;
    }
    if(!res||p[res].r<a[x])return -1;
    if(p[res].r-L>=a[1])
    {
        for(l=1,r=x;l<=r;)
            if(a[mid=l+r>>1]>p[res].r-L)q[x]=mid,r=mid-1;
            else l=mid+1;
        return t[x]=k+1,0;
    }
    else q[x]=0;
    for(l=x,r=k;l<=r;)
        if(a[mid=l+r>>1]>p[res].r)r=mid-1;
        else l=t[x]=mid+1;
    return 0;
}
int main()
{
    freopen("launch.in","r",stdin);
    freopen("launch.out","w",stdout);
    int m,i,j,k,ans;
    n=read();m=read();L=read();
    for(i=1;i<=n;++i)
    {
        p[i].l=read();p[i].r=read();
        if(p[i].r<p[i].l)p[i+1].l=0,p[i+1].r=p[i].r,p[i].r+=L,++i,++n;
    }
    sort(p+1,p+n+1,cmp);
    for(i=1,p[j=0].r=-1;i<=n;++i)if(p[i].r>p[j].r)p[++j]=p[i];n=j;
    while(m--)
    {
        for(k=read(),i=1;i<=k;++i)a[i]=read();
        sort(a+1,a+k+1);
        for(i=1,a[j=0]=-1;i<=k;++i)if(a[i]!=a[i-1])a[++j]=a[i];
        for(i=1;i<=j;++i)if(get(i,j))break;
        if(i<=j){puts("-1");continue;}
        for(i=0;i++<=j;)c[i][0]=c[i][1]=fa[i]=0,s[i]=1;
        for(i=1;i<=j;++i)tf[i]=t[i];tf[i]=-1;
        access(1);ans=s[c[1][0]];
        for(i=0;i++<=j;)c[i][0]=c[i][1]=fa[i]=0,s[i]=1;
        for(i=1;i<=j;++i)tf[i]=-1;
        for(i=1;i<=j;++i)
        {
            if(q[i])ans=min(ans,(access(q[i]),s[c[q[i]][0]]+1));
            splay(i);tf[i]=t[i];
        }
        printf("%d\n",ans);
    }
    fclose(stdin);fclose(stdout);return 0;
}

T3.

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
inline int read()
{
    int x=0;char c;
    while((c=getchar())<‘0‘||c>‘9‘);
    for(;c>=‘0‘&&c<=‘9‘;c=getchar())x=x*10+c-‘0‘;
    return x;
}
#define MN 100000
#define N 131072
#define INF (1LL<<60)
int c[MN+5],cn,l[MN+5],r[MN+5],t[MN+5],w[MN+5];
ll ans=INF,t1[N*2],t2[N*2];
void renew(ll*t,int k,ll x)
{
    if(x>=t[k+=N])return;
    for(t[k]=x;k>>=1;)t[k]=min(t[k<<1],t[(k<<1)+1]);
}
ll query(ll*t,int l,int r)
{
    ll res=INF;
    for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1)
    {
        if(~l&1)res=min(res,t[l+1]);
        if( r&1)res=min(res,t[r-1]);
    }
    return res;
}
int findl(int x)
{
    int l=1,r=cn,mid,res;
    while(l<=r)
        if(c[mid=l+r>>1]<x)l=mid+1;
        else r=mid-1,res=mid;
    return res;
}
int findr(int x)
{
    int l=1,r=cn,mid,res;
    while(l<=r)
        if(c[mid=l+r>>1]>x)r=mid-1;
        else l=mid+1,res=mid;
    return res;
}
int main()
{
    freopen("network.in","r",stdin);
    freopen("network.out","w",stdout);
    int n,m,i,j,x,y,z;ll a,b;
    n=read();c[++cn]=1;c[++cn]=m=read();
    for(i=1;i<=n;++i)l[i]=read(),r[i]=read(),c[++cn]=t[i]=read(),w[i]=read();
    sort(c+1,c+cn+1);
    for(i=1,j=0;i<=cn;++i)if(c[i]!=c[i-1])c[++j]=c[i];cn=j;
    memset(t1,42,sizeof(t1));memset(t2,42,sizeof(t2));
    renew(t1,1,0);renew(t2,cn,0);
    for(i=1;i<=n;++i)
    {
        x=findl(l[i]);y=findr(r[i]);z=findl(t[i]);
        a=query(t1,x,y);b=query(t2,x,y);
        if(a+b+w[i]<ans)ans=a+b+w[i];
        renew(t1,z,a+w[i]);renew(t2,z,b+w[i]);
    }
    printf("%lld",ans<INF?ans:-1);
    fclose(stdin);fclose(stdout);return 0;
}
时间: 2024-11-24 22:44:27

2017-2-19四校联考的相关文章

10.29 FJ四校联考

//四校联考Rank 16 感觉很滋磁 (虽然考的时候抱怨厦门一中出的数学题很NOIP///) 圈地 [问题描述] n根长度不一定相同的木棍,至多可以对其中一根切一刀,然后用其中的任意根围一个三角形,求三角形的最大面积.设面积为S,输出16*S^2对998244353取模后的答案.特别地,无解输出-1. 注:退化的三角形(面积为零)不被认为是三角形,答案应该为-1. [输入文件] 输入文件为tri.in. 输入文件第一行包含两个正整数n和998244353. 第二行包含n个正整数,表示每根木棍的

四校联考2017.8.20T1填算式

由于T2和T3都太高深了太巧妙了,于是只会做T1,拿了95分.现提供95分做法与满分做法 数据范围:n≤13,1≤ai≤9,0≤k≤109 大意:给n个数,在其中填+?×,允许多个数合并为一个.求使得最终结果等于k的算式数量.(这不就是我们平常玩的24点的加强版吗?) 95分解法:我们注意到对于第一个数字,其前面的操作只能为加法,对于之后的每一个数字,我们都有四种操作:在前面填加号,减号,乘号:与前面的数字合并.注意到n的值很小,于是考虑深搜.用两个数组分别记这个算式的符号和数字,当深搜到最后的

2016年9月25日四校联考

·前言:啊f**k今天早上体检,但是并不影响做题2333因为题目真的好 NOIP 啊 啊对了附中评测姬好坑啊正解强行T 23333 第一题<萝卜种子> 简要题意:小姑娘看了看狐狸的萝卜田,发现田里最多只能生长7个萝卜(多余的种子不会发芽),且4种萝卜发芽的概率是完全相同的.它们的效果分别是: 普通萝卜:生产2kg兔粮 超能萝卜:生产2kg兔粮,每种植一个其他萝卜额外产生1kg兔粮 固氮萝卜:不能用于生产兔粮,但能使每个普通萝卜和超能萝卜生产的兔粮+1kg 金坷垃萝卜:不能用于生产兔粮,但能使每

Tree (四校联考T1)

[题目描述] 方方方种下了三棵树,一年后,第一棵树长出了n个节点. 方方方会向你提出m个询问,每个询问给出两个数i,j,你需要回答i号节点和j号节点在树上的距离. [输入数据] 第一行两个整数n,m.接下来n-1行每行两个整数a,b表示一条边.接下来m行每行两个整数i,j表示询问. [输出数据] m行,每行一个整数表示答案. [样例输入] 3 2 1 2 1 3 3 2 1 1 [样例输出] 2 0 [数据范围] 对于30%的数据,n,m<=1000. 对于100%的数据,n,m<=50000

2017-3-5四校联考

szy学长出的,除了T3外都比较水 360/400. T1.小猪划船 题目大意:六只猪要过河,三只大猪ABC,三只小猪abc,其中ABCa会划船,共一只船,每次可以载2个人,给出四只猪的划船耗时,每次运载花的时间是船上耗时最小的猪的耗时乘上船上猪的个数,小猪与其对应大猪不在一起时不能与其他大猪在一起,求所有猪到对岸的最小耗时. 思路:状态最多2^7(每只猪还有船的位置),随便建图最短路或者直接搜索或者构造都能通过该题.我写的O(2^21). #include<cstdio> #include&

四校联考 推冰块

2<=n,m<=10^9,0<=k<=50000. 我们发现有用的格子不是很多,经过详细的分类讨论,只有这些格子是有用的: 四个角,以及障碍物(或减速带)本身和上下左右四个方向,以及障碍物所在行列(及±1的)的头尾两个. 那么我们只要把所有 障碍 和 减速带 按x-y和y-x排序一下,对于每一个有用的格子二分一下找到往左和往右会推到哪里,连边完暴力bfs即可. #include <iostream> #include <stdio.h> #include &

17-09-10四校联考

T1:从高到低依次确定答案的每一位,如果每个区间的第i位都可以选1,那么全部选1,答案的这一位就是1. 如果该区间这一位能够选择0或1,那么将区间缩小为2i至ri. 如果不是所有区间都能选1,答案的这一位是0. 如果该区间这一位能够选择0或1,则该区间选0,并将所有比这一位低的位的值全部赋为1.时间复杂度O(n log 1018). Code: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4

20170814四校联考

啊啊啊啊啊啊NOIAu大神ysy出题虐菜出人命啦!爆tan(pi/4)啦!被害者家属情绪稳定. ysy大佬谁敢D啊,NOIAu1st了,只适合D人了. 还是IOIAu的大佬体谅人,我还那么蒟蒻呢~ 闲话不说,上题目: T1: 宝石(gem) [题目描述]有 n 座城市,编号为 1~n,第 i 座城市里宝石的交易价格为 ai.当你经过第 i 座城市时,你可以以 ai 的价格购买或卖出一个宝石.在任意时刻,你最多只能携带一个宝石.有 m 次操作,操作分为两种:(1) 给定l,r,询问依次经过编号为l

[20180901]四校联考

T1.数列(number) Solution 首先我们考虑形如\(\frac{n^2}{2}\)的数,显然n个这样的数会提供\(\frac{n(n-1)}{2}\)对. 把k看作是几个形如\(\frac{n(n-1)}{2}\)的和,从大到小贪心加. 要保证任意两个不同的数的和不是完全平方数,暴力构造一下就可以了. #include<iostream> #include<cstdio> #include<algorithm> typedef long long ll;

2017-2-26福建四校联考

哎我好菜啊 从来没打过表的萌新这次想打个表结果打太多了长度超限了(后来发现根本没必要打表) ---------我是分割线 A.矩形 给定一个2*n的矩形,每个位置有一个正权值,你要把它恰好分成m个矩形,使得所有矩形的和的最大值最小并求出最小的最大值. n<=100000 m<=100 题解: 首先很显然m只是一个附加条件,如果你能分<m段,那么你一定能分m段. 看到最大值最小,最小值最大的问题,很自然想到二分答案. 然后我们用一个dp来check.用f[i]表示前i*2的矩形至少要分几段