zoukankan      html  css  js  c++  java
  • 9.14——模拟赛

     T1 仙 临江仙 旧梦  (Topcoder SRM 703 div2 500pts)

    题目背景
    闻道故园花陌,今年奼紫嫣红。扬帆直渡水千重。东君何解意,送我一江风。
    还是昔时庭院,终得醉卧花丛。残更惊醒月明中。流光如旧岁,多少梦成空。
    题目描述
    #define goodcatdog gcd
    #define important i
    #define judge j
    神说 每个梦想就是一轮月亮,高高地孤寂地挂在清冷的夜空。为了让月亮不再
    孤独,灯神给她找了好多好多伴儿。现在天空上就有n轮月亮啦!
    月亮在天上跟相邻的伙伴玩够以后,就开始想要去找其他月亮玩,灯神为了让月
    亮变得更聪明,下了一个规定:若两个月亮编号分别为 important 和 judge ,若
    important , judge 满足 goodcatdog ( important , judge )>β,则 important , judge 就可以联通。
    现在来了一个垃圾神叫J乌拉,他想知道编号为x的月亮和编号为y的月亮 是否联
    通,聪明的你能帮帮它吗????
    输入描述
    第一行为一个数T,表明有T组测试数据
    四个个数n,β,x,y;
    输出描述
    若x,y联通,输出YeS,否则输出No
    样例输入
    1
    12 2 8 9
    样例输出
    YeS
    数据范围: :
    对于30%的数据 n<=10
    对于50%的数据 n<=15
    对于第六个测试点 n<=65432
    对于第七,八个测试点 n<=999999
    对于100%的数据 n,β,<=1000000;T<=4;x,y<=10000000

    并查集维护β的倍数、

     1 #include <cstdio>
     2 
     3 inline void read(int &x)
     4 {
     5     x=0; register char ch=getchar();
     6     for(; ch>'9'||ch<'0'; ) ch=getchar();
     7     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
     8 }
     9 
    10 int fa[1000005];
    11 int GCD(int a,int b)
    12 {
    13     return !b ?a :GCD(b,a%b);
    14 }
    15 int find(int x)
    16 {
    17     return fa[x]==x?x:fa[x]=find(fa[x]);
    18 }
    19 
    20 int Presist()
    21 {
    22     freopen("dream.in","r",stdin);
    23     freopen("dream.out","w",stdout);
    24     int t,n,b,x,y; read(t);
    25     for( ; t--; )
    26     {
    27         read(n),read(b),read(x),read(y);
    28         for(int i=1; i<=n; ++i) fa[i]=i;
    29         if(GCD(x,y)>b||x==y)
    30         {
    31             puts("YeS");
    32             continue;
    33         }
    34         for(int fx,fy,i=b+1; i<=n; ++i)
    35         {
    36             fx=find(i);
    37             for(int j=i; j<=n; j+=i)
    38                 fa[find(j)]=fx;
    39         }
    40         if(find(x)==find(y)) puts("YeS");
    41         else puts("No");
    42     }
    43     return 0;
    44 }
    45 
    46 int Aptal=Presist();
    47 int main(){;}
    AC

    T2  长命女 (洛谷 P3047 [USACO12FEB]附近的牛Nearby Cows

    题目背景
    夏夜宴,绿酒一杯歌一遍
    再拜陈三愿:
    一愿郎君千岁;
    二愿妻妾常健;
    三月如同梁上雕燕,
    你我常相见
    题目描述
    给定一个r*c的矩阵,在这个矩阵中有...一棵树!这棵树上有n间小屋,每间小
    屋都有v[i]个松果,两个小屋之间有一条双向树枝相连。
    小浪是一只特别懒的小松鼠, 他希望知道从每间小屋 向外扩展 γ 步范围内最多能
    拿到多少松果,不聪明的你可以帮帮他吗????
    输入描述
    第一行 r,c
    第二行 n,γ
    以下n-1行 x,y有连边
    最后一行n个数 表示每个小屋的松果数目。
    输出描述
    n行,每行为第i个小屋最多能拿到多少松果
    样例输入
    8 8
    6 2
    5 1
    3 6
    2 4
    2 1
    3 2
    1
    2
    3
    4
    5
    6
    样例输出
    15
    21
    16
    10
    8
    11
    数据范围
    对于10%的数据:n<=10,r<=c<=50
    对于40%的数据:n<=1000
    对于100%的数据:n<=100000;0<=v[i]<=1000;γ<=20;r<=1000000,c<=1000000

     1 #include <cstdio>
     2 
     3 inline void read(int &x)
     4 {
     5     x=0; register char ch=getchar();
     6     for(; ch>'9'||ch<'0'; ) ch=getchar();
     7     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
     8 }
     9 const int N(100000+5);
    10 int val[N],n,m;
    11 int head[N],sumedge;
    12 struct Edge {
    13     int v,next;
    14     Edge(int v=0,int next=0):v(v),next(next){}
    15 }edge[N<<1];
    16 inline void ins(int u,int v)
    17 {
    18     edge[++sumedge]=Edge(v,head[u]);
    19     head[u]=sumedge;
    20     edge[++sumedge]=Edge(u,head[v]);
    21     head[v]=sumedge;
    22 }
    23 
    24 int sum[N];
    25 int DFS(int u,int pre,int cnt)
    26 {
    27     if(cnt<0) return 0;
    28     sum[u]=val[u];
    29     for(int v,i=head[u]; i; i=edge[i].next)
    30     {
    31         v=edge[i].v;
    32         if(pre==v) continue;
    33         sum[u]+=DFS(v,u,cnt-1);
    34     }
    35     return sum[u];
    36 }
    37 
    38 int Presist()
    39 {
    40     freopen("young.in","r",stdin);
    41     freopen("young.out","w",stdout);
    42     
    43     int r,c; read(r),read(c);
    44     read(n),read(m);
    45     for(int u,v,i=1; i<n; ++i)
    46         read(u),read(v),ins(u,v);
    47     for(int i=1; i<=n; ++i) read(val[i]);
    48     for(int i=1; i<=n; ++i)
    49         printf("%d
    ",DFS(i,-1,m));
    50     return 0;
    51 }
    52 
    53 int Aptal=Presist();
    54 int main(){;}
    40分暴力 (洛谷60)
     1 #include <cstdio>
     2 
     3 inline void read(int &x)
     4 {
     5     x=0; register char ch=getchar();
     6     for(; ch>'9'||ch<'0'; ) ch=getchar();
     7     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
     8 }
     9 const int N(100000+5);
    10 int val[N],n,m;
    11 int head[N],sumedge;
    12 struct Edge {
    13     int v,next;
    14     Edge(int v=0,int next=0):v(v),next(next){}
    15 }edge[N<<1];
    16 inline void ins(int u,int v)
    17 {
    18     edge[++sumedge]=Edge(v,head[u]);
    19     head[u]=sumedge;
    20     edge[++sumedge]=Edge(u,head[v]);
    21     head[v]=sumedge;
    22 }
    23 
    24 int sum[N][25],dad[N];
    25 void DFS(int u,int pre)
    26 {
    27     dad[u]=pre;
    28     sum[u][0]=val[u];
    29     for(int v,i=head[u]; i; i=edge[i].next)
    30     {
    31         v=edge[i].v;
    32         if(v==pre) continue;
    33         DFS(v,u);
    34         for(int j=1; j<=m; ++j)
    35             sum[u][j]+=sum[v][j-1];
    36     }
    37 }
    38 
    39 int Get(int x)
    40 {
    41     int ret=sum[x][m],t=m;
    42     for(; x!=1&&t; x=dad[x])
    43     {
    44         ret+=sum[dad[x]][--t];
    45         if(t) ret-=sum[x][t-1];
    46     }
    47     return ret;
    48 }
    49 
    50 int Presist()
    51 {
    52 //    freopen("young.in","r",stdin);
    53 //    freopen("young.out","w",stdout);
    54 
    55 //    int r,c; read(r),read(c);
    56     read(n),read(m);
    57     for(int u,v,i=1; i<n; ++i)
    58         read(u),read(v),ins(u,v);
    59     for(int i=1; i<=n; ++i) read(val[i]);
    60     DFS(1,-1);
    61     for(int i=1; i<=n; ++i)
    62       for(int j=1; j<=m; ++j)
    63         sum[i][j]+=sum[i][j-1];
    64     for(int i=1; i<=n; ++i)
    65         printf("%d
    ",Get(i));
    66     return 0;
    67 }
    68 
    69 int Aptal=Presist();
    70 int main(){;}
    树形DP f[i][j]表示i节点,扩展j步的最大数

    T3  春江花月夜(  BZOJ 1108: [POI2007]天然气管道Gaz )

    题目背景
    春江潮水连海平,海上明月共潮生。滟滟随波千万里,何处春江无月明!
    江流宛转绕芳甸,月照花林皆似霰;空里流霜不觉飞,汀上白沙看不见。
    江天一色无纤尘,皎皎空中孤月轮。江畔何人初见月?江月何年初照人?
    人生代代无穷已,江月年年只相似。不知江月待何人,但见长江送流水。
    白云一片去悠悠,青枫浦上不胜愁。谁家今夜扁舟子?何处相思明月楼?
    可怜楼上月徘徊,应照离人妆镜台。玉户帘中卷不去,捣衣砧上拂还来。
    此时相望不相闻,愿逐月华流照君。鸿雁长飞光不度,鱼龙潜跃水成文。
    昨夜闲潭梦落花,可怜春半不还家。江水流春去欲尽,江潭落月复西斜。
    斜月沉沉藏海雾,碣石潇湘无限路。不知乘月几人归,落月摇情满江树。
    题目描述
    小春和小江是两个很好的朋友,他们都信奉灯神教。有一天,小春突发奇想,学
    习起了莫比乌斯反演,恰好在这天,小江也突发奇想,学起了快速傅里叶变换。
    可是莫比乌斯反演比快速傅里叶变换字数多啊,于是乎小春就比小江学得快。
    小春非常得意,利用所学知识给小江出了一倒防AK好题:已知在这个宇宙中有n
    个太阳和n个月亮,由于宇宙之神--灯神是一个喜爱数学的神,所以他就规定了n
    属于数域P。灯神把整个宇宙抽象成了一个 二维平面坐标系,对于每个太阳和每
    个月亮,都有自己的一个坐标xi,yi 坐标也是数域成员。如果一个太阳想去找一
    个月亮玩,那么 他只能往东面或者南面飞 。月亮是不能动哒!飞行单位距离为1,
    他就会消耗
     
    1 mod ) / * (
    2 / ) 1 (
    1




    q p kq p
    p
    k
    的花费 灯神想知道怎么让每个太阳都能找
    到某个月亮玩使得花费最小 (一个月亮只能被找一次) ?小江一下子就被难倒了,
    询问聪明的你, 那么聪明年轻帅气漂亮颜值居高无比的你能帮助他解决这个问题
    吗?(保证答案在long int的十分之一范围内)。
    题目提示
    1.数域定义 设F是一个数环( 设S S 是复数集的非空子集,如果S S 中的数对任意两个
    数的和 、 差 、 积仍属于S S , 则称S S 是一个数环。),如果对任意的a,b∈F而且a≠0,
    则b/a∈F;则称F是一个数域。著名的域有:Klein四元域。
    数域性质 任何数域都包含有理数域Q。即Q是最小的数域。
    证明:F必有一个非零元素a.由于F为数环,所以0 = a - a属于F1 = a/a 属于F0
    和1都属于F那么2 = 1+13 = 2+1。。。。自然数N都属于F-n = 0 - n 也属于F
    故整数集合Z都属于F那么a/b 也属于F(其中a,b为整数)这样,任何一个数域都
    包含Q
    2.莫比乌斯反演
    卷积:令d|n表示d能整除n,比如 2|4 (=.=)定义关于整数的函数F(n)然后定义
    G(n)=Σ(F(d)) (其中d|n)
    反演原式:G(n)=Σ(F(d))(其中d|n)
    反演公式:F(n)=Σ(U(n/d)*G(d))这里U是莫比乌斯函数,他是每一项 G(d) 的系
    数。
    3.欧拉函数:
    其中p1, p2……pn为x的所有质因数,x是不为0的整数。
    φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。
    输入描述
    第一行为一个正整数n,表示天月亮的数量(太阳的数量与之相等)。接下来n
    行,每行两个整数xi和yi,表示太阳的坐标。规定向东向北为x,轴正方向。接下
    来n行,每行两个数a和b,示月亮的坐标。
    输出描述
    第一行包含一个数,表示最小的花费。答案对斐波那契数列的第100000007项取
    模。
    样例输入
    3
    3 5
    1 2
    4 3
    6 3
    5 2
    2 1
    样例输出
    9
    数据范围
    对于30%的数据 n<=300
    对于第四,五个测试点 n<=20000
    对于第六,七,八个测试点 n<=25000
    对于100%的数据 n<=3 0 0 0 1;0<=xi,yi<=1 0 0 0 0 0,0<=a,b<=1 0 0 0 0 0.
    保证答案存在。

    无聊的公式、

    一定有解,且太阳只能向南和东走,画图意会吧。。

     1 #include <algorithm>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 
     5 inline void read(long long &x)
     6 {
     7     x=0; register char ch=getchar();
     8     for(; ch>'9'||ch<'0'; ) ch=getchar();
     9     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
    10 }
    11 
    12 long long ans,n,x,y;
    13 
    14 int Presist()
    15 {
    16 //    freopen("moon.in","r",stdin);
    17 //    freopen("moon.out","w",stdout);
    18     
    19     read(n);
    20     for(long long i=1; i<=n ;++i)
    21     {
    22         read(x),read(y);
    23         ans-=x,ans+=y;
    24     }
    25     for(long long i=1; i<=n ;++i)
    26     {
    27         read(x),read(y);
    28         ans+=x,ans-=y;
    29     }
    30     printf("%I64d
    ",ans);
    31     return 0;
    32 }
    33 
    34 int Aptal=Presist();
    35 int main(){;}
    AC
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    poj 2728 Desert King
    uva 439 Knight Moves
    hdu 1875 畅通工程再续
    scau实验题 8600 骑士周游问题(有障碍物)
    scau实验题 8596 Longest Ordered Subsequence
    poj 1679 The Unique MST
    uva 527 Oil Deposits
    poj 2533 Longest Ordered Subsequence
    .net 程序员 java 开发入门
    Collation conflict occur at operation on User define funtion & table's column
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7520701.html
Copyright © 2011-2022 走看看