ZQSZ && LWYZ 胡策记录

此文为博主原创,转载...转载这种文章有意思吗qwq

严禁各OJ在未经博主同意的情况下擅自使用博文中的题面作为OJ题目。

今天做的是我校dalao@wzy出的套题w【被长达6页的题面淹没】

dalao的题就是难...T1就懵逼了...3.5h不知道自己都干了些什么...

最后80+30+0+0  rank7滚粗。

感觉这次题好多人都翻车了,我这么菜到底是怎么rank7 的QAQ

NOIP2017 RP ++

A.谜团

题目大意:

谜团在第一秒会转化一个“虚灵”,之后的时间内将不再转化单位。新

产生的“虚灵”会在下一秒分裂出m 个“虚灵”,原有的“虚灵”仍然存在,并且不再产生虚灵。

新产生的“虚灵”可在下一秒分裂,之后也不再产生“虚灵”。

给定时间 t 和分裂数m,问在 t 秒后,谜团拥有多少个“虚灵”。答案可能很大,要求你模一个数k(不保证k是质数)。

数据范围:

1<=k<=10^8,1<=m<=100,1<=t<=2^31-1

分析:

这题的部分分范围我没有贴...(你什么时候贴过部分分范围啊喂!)

经过推导可以发现,题目的答案其实就是对首项为1,公比为m的等比数列求和。答案为S(t-1)。

直接暴力做的话可以拿40分。

部分分中有一部分是保证m与k互质的,此时可以用等比数列求和公式+逆元,加上暴力部分的数据分治,80分。

满分做法:S(n+m)=S(n)+S(m)*qn

sum(p,c)表示计算 p^0 + p^1 + ... + p^c

如果c是偶数,答案就是 p^0 + p^1 + ... + p^(c/2 - 1) * (1 + 2^(c/2)) + p^c

展开得到 p^0 + p^1 + ... + p^(c/2 - 1) + p^(c/2) + p^(c/2+1) + ... + p^c

如果c是奇数  那么答案就是  p^0 + p^1 + ... + p^(c/2) * (1 + 2^(c/2 + 1))

展开得到 p^0 + p^1 + ... + p^(c/2) + p^(c/2 + 1) + ... + p^c

用一个递归函数计算即可。

AC代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5
 6 inline void read(long long &x)
 7 {
 8     char ch = getchar(),c = ch;x = 0;
 9     while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar();
10     while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar();
11     if(c == ‘-‘) x = -x;
12 }
13
14 long long k,m,t,ans;
15 //S(n+m) = S(n)+S(m)*q^n
16 long long ksm(int b)
17 {
18     long long base = m,r = 1;
19     for(;b;b>>=1)
20     {
21         if(b&1) r = r*base%k;
22         base = base*base%k;
23     }
24     return r;
25 }
26
27 long long calc(int t)
28 {
29     if(t == 0) return 1;
30     if(t&1) return (calc(t/2)*(1+ksm(t/2+1))%k)%k;
31     else return (calc(t/2-1)*(1+ksm(t/2))%k+ksm(t))%k;
32 }
33
34 int main()
35 {
36     read(m),read(t),read(k);
37     printf("%lld\n",calc(t-1)%k);
38     return 0;
39 }

mituan

B.祈求者

题目大意:

有一个长度为k的字符串和n个字符集合。你可以从每个字符集合中选择至多1个字符,使它们拼成

字符串的前缀。求能够拼出的最长前缀。

输入的第一个字母为T,表示接下来有T组数据。

数据范围:

1<=T<=20,1<= Σai+n <= 200,1 <= k <= 200.

分析:

如果把题目改成这样:

【从每个字符集合中选择至多一个字符,尽量多地、连续地匹配前缀】

是不是很容易就想到了二分图匹配呀。

最大流也可做,不过当时这题有dalao用费用流拿了100分,向dalao低头www

如果1~mid能够匹配,则1~mid-1也一定能匹配;1~mid不能完全匹配,1~mid+1也不能完全匹配,可以二分。

二分能够匹配的前缀的最长长度,对于每次二分出的长度,做一次二分图匹配。

如果匹配数==二分的长度,说明该长度是可行的。

AC代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5
 6 inline void read(int &x)
 7 {
 8     char ch = getchar(),c = ch;x = 0;
 9     while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar();
10     while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar();
11     if(c == ‘-‘) x = -x;
12 }
13
14 int t,n,l,r,mid,ans,cnt,len,tmp;
15 int head[6000],link[500],vis[500];
16 char s[202],glo[202][202];
17
18 struct Edge
19 {
20     int f,t,nxt;
21 }e[6000];
22
23 void insert(int f,int t)
24 {
25     e[++cnt].f = f,e[cnt].t = t;
26     e[cnt].nxt = head[f];
27     head[f] = cnt;
28 }
29
30 bool dfs(int now)
31 {
32     for(int i = head[now];i;i = e[i].nxt)
33     {
34         int to = e[i].t;
35         if(vis[to]) continue;
36         vis[to] = 1;
37         if(!link[to] || dfs(link[to]))
38         {
39             link[to] = now;
40             return true;
41         }
42     }
43     return false;
44 }
45
46 bool check(int x)
47 {
48     memset(link,0,sizeof(link));
49     memset(head,0,sizeof(head));
50     memset(e,0,sizeof(e));cnt = 0;
51     int res = 0;
52     for(int l = 1;l <= x;++ l)
53         for(int i = 1;i <= n;++ i)
54         {
55             tmp = strlen(glo[i]+1);
56             for(int j = 1;j <= tmp;++ j)
57                 if(glo[i][j] == s[l])
58                     insert(l,i);
59         }
60     for(int i = 1;i <= x;++ i)
61     {
62         memset(vis,0,sizeof(vis));
63         if(dfs(i)) res ++;
64     }
65 //    printf("%d %d\n",cnt,r);
66     if(res == x) return true;
67     else return false;
68 }
69
70 int main()
71 {
72 //    freopen("kaer.in","r",stdin);
73 //    freopen("kaer.out","w",stdout);
74     freopen("1.txt","r",stdin);
75     read(t);
76     while(t -- )
77     {
78         read(n);
79         for(int i = 1;i <= n;++ i)
80             scanf("%s",&glo[i][1]);
81         scanf("%s",s+1);
82         len = strlen(s+1);
83         l = 1,r = len,ans = 0;
84         while(l <= r)
85         {
86             mid = (l+r)>>1;
87             if(check(mid)) l = mid+1,ans = mid;
88             else r = mid-1;
89         }
90         printf("%d\n",ans);
91     }
92     return 0;
93 }

kaer

C.大地之灵

题目大意:

有三种颜色点,不同颜色的点之间可以任意连边,同色的点之间必须间隔至少2个其他颜色的点才能连边。

给出这三种点的个数n,m,k,求连边的方案数。答案%1e9+7。

数据范围:

1 <= n,m,k <= 5000

分析:

先考虑有两种点的情况。由题意可知,此时每个点的出度最多为1,边数最多为Min(a,b)。

把边分别编号为1,2,3...n,进行DP。

dp[i]表示连了i条边的方案数。转移方程:dp[i] = dp[i-1]*(a-i+1)*(b-i+1)/i

转移比较容易想到,但是为什么要除以i可能不容易理解。

因为连的边是无序的,但是为了方便DP,你给边钦定了顺序。

这样一来就会导致:完全相同的两条边,编号为1,2时计算一次,编号为2,1时计算一次。

最终答案为Σdp[i]

同理,当有三种颜色时,只需要把这个过程做三次,乘起来即可。

AC代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5
 6 const int MOD = 1e9+7;
 7 inline void read(int &x)
 8 {
 9     char ch = getchar(),c = ch;x = 0;
10     while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar();
11     while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar();
12     if(c == ‘-‘) x = -x;
13 }
14
15 int n,m,k;
16 long long ans,dp[25000001];
17
18 inline int Max(int a,int b)
19 {return a>b?a:b;}
20
21 long long calc(int a,int b)
22 {
23     long long r = 0;
24     for(int i = 1;i <= 25000000;++ i)
25         if(!dp[i]) break;
26         else dp[i] = 0;
27     dp[0] = 1;
28     int mx = Max(a,b);
29     for(int i = 1;i <= mx;++ i)
30         dp[i] = (dp[i-1]*(a-i+1)*(b-i+1)/i)%MOD;
31     for(int i = 0;i <= mx;++ i)
32         r = (r+dp[i])%MOD;
33     return r;
34 }
35
36 int main()
37 {
38     read(n),read(m),read(k);
39     ans = calc(n,m)*calc(n,k)%MOD *calc(m,k)%MOD;
40     printf("%lld\n",ans);
41     return 0;
42 }

ES

D.裂魂人

题目大意:

给你一张n 个点,m 条边的无向图(没有重边,没有自环),每条边有一个边权w。

输出起点为S,终点为E,且恰好经过k 条边的最短路长度。

不保证起点和终点不是同一个点,保证有解。点的编号为1,2,...,n

数据范围:

3 <= n <= 200, 2 <= m <= 200,1 <= w <= 1000,k<= 1,000,000

分析:

这什么蛇皮题目!我不做辣!

正解:Floyd倍增+矩阵快速幂加速DP

反正我是不会的qwq读者有意向的话可以问@wzydalao

时间: 2024-10-13 10:56:44

ZQSZ && LWYZ 胡策记录的相关文章

弱省胡策系列简要题解

现在不是非常爽,感觉智商掉没了,就整理一下最近弱省胡策的题目吧. 其实题目质量还是很高的. 如果实在看不懂官方题解,说不定这里bb的能给您一些帮助呢? [弱省胡策]Round #0 A 20%数据,O(n4)傻逼dp. 40%数据,O(n3)傻逼dp. 100%数据,令f(x1,y1,x2,y2)表示从(x1,y1)走到(x2,y2)的路径条数.于是所有路径就是f(1,2,n?1,m)×f(2,1,n,m?1).然而两条路径可能在中间的某个点相交,我们找出最早的交点,并在这个交点互换两条路径的后

【弱校胡策】2016.4.14 (bzoj2164)最短路+状压DP+矩阵乘法+高斯消元+树链剖分+线段树+背包DP

cyyz&qhyz&lwyz&gryz弱校胡策 命题人:cyyz ws_fqk T3暴力写挫了 50+10+0滚粗辣! 奇妙的约会(appointment.cpp/c/pas) [问题描述] DQS和sxb在网上结识后成为了非常好的朋友,并且都有着惊人 的OI水平.在NOI2333的比赛中,两人均拿到了金牌,并保送进入 HU/PKU.于是两人决定在这喜大普奔的时刻进行面基. NOI2333参赛选手众多,所以安排了n个考点,DQS在1号考点, 而sxb在n号考点.由于是举办全国性赛事

校内胡策(唯一一个想出来的)

2 第一题 (third.cpp/c/pas) 题目描述 小 R 最近沉迷于一个叫做 Slay.one 的游戏. 在这个游戏中,每一局有若干人参加,最终会产生一个优胜者.优胜者会获得 一个成就点. 现在小 R 已经利用某种手段得知了每场游戏有哪些人参加.假设所有人最初成 就点都是 0 ,小 R 想要知道所有游戏结束之后成就点最多的人至少有多少成就点. 校内胡策(唯一一个想出来的) 原文地址:https://www.cnblogs.com/Lance1ot/p/9445468.html

山西胡策 #7

A. B. C. 题意:给出(i, j)之类的约束表示要j必须先i,问1尽量靠前.2尽量靠前.3尽量靠前以此类推的最优方案,或输出无解. #include <bits/stdc++.h> using namespace std; const int N=100005; int cnt, ihead[N], in[N], ans[N], tot, n, m; struct E { int next, to; }e[N]; void add(int x, int y) { e[++cnt]=(E)

【弱省胡策】Round #7 Rectangle 解题报告

orz PoPoQQQ 的神题. 我的想法是:给每一个高度都维护一个 $01$ 序列,大概就是维护一个 $Map[i][j]$ 的矩阵,然后 $Map[i][j]$ 表示第 $i$ 根柱子的高度是否 $\ge j$. 那么怎么维护 $Map[i][j]$ 呢..? 首先我们把柱子按照高度从小到大排序,然后依次给每个高度建主席树,初始时 $Map[i][0]$ 全是 $1$,然后如果当前高度 $i$ 比某个柱子 $j$ 的高度要大了,那么就单点修改 $Map[i][j]$,然后这个就是主席树动态开

【胡策篇】题解

和泉纱雾与烟花大会 题目来源: UOJ 192 最强跳蚤 (只改了数据范围) 官方题解: 在这里哦~(说的很详细了 我都没啥好说的了) 题目大意: 求树上各边权乘积是完全平方数的路径数量. 这种从\(n^2\)条路径中找出满足xx条件的路径的条数的题, 我们可以根据常识判断要用到点分治. 不过这题并没有用到点分治, 这个一会再说, 我们先来看部分分. 哎呀其实这题好多部分分我都不会写(捂脸 算法1: 直接乘边权处理显然是不行哒, 怕是\(w\leq2\)怕是都要用到高精度了(什么你说\(w\le

校内胡策 埃罗芒阿老师 - 贪心 &amp; 堆 + EX难度 - DP

题目描述 埃罗芒阿老师是著名的插画家,她的工作是为电击文库出版的的书画插画.快要到截稿日了,埃罗芒阿老师还在水>_<埃罗芒阿突然发现自己还有一大堆插画没有完成,如果不能在截稿时间内完成是要扣工资的.于是埃罗芒阿老师把每个任务所需的时间和现在(0 时刻)距离每个任务截稿的时间记录了下来,想要计算出最多可以完成多少任务.输入描述 第一行是一个整数 N,接下来 N 行每行两个整数 T1,T2 描述一个任务:完成这个任务需要 T1 秒,如果在 T2 秒之内还没有完成任务,这个任务就到截稿时间了.输出描

校内胡策 T9270 mjt树

题目背景 从前森林里有一棵很大的mjt树,树上有很多小动物. 题目描述 mjt树上有 n 个房间,第 i 个房间住着 ai 只第bi 种小动物. 这n个房间用n-1条路连接起来,其中房间1位mjt树的根. 现在每个房间x的小动物想知道,以房间x为根的mjt树中有多少只它们的同类. 输入输出格式 输入格式: 第一行一个整数n,表示房间数 接下来n行,每行两个整数ai,bi 再之后n-1,每行两个整数x.y,表示x和y之间有一条路径 输出格式: 一行n个数,第i个数表示以房间i为根的mjt树中bi种

口胡提交记录

为了偷懒提高刷题效率,有些题目只做口胡,并在此整理. 1.19 CF1101D GCD Counting pro:https://www.luogu.org/problemnew/show/CF1101D sol:https://www.cnblogs.com/Creed-qwq/p/10293719.html 原文地址:https://www.cnblogs.com/Creed-qwq/p/10293731.html