Wannafly挑战赛22游记
Wannafly挑战赛22游记
幸运的人都是相似的,不幸的人各有各的不幸。
——题记
A-计数器
题目大意:
有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2,\ldots,a_n\)中的任意一个整数,操作次数不限(可以为\(0\)次),问计数器的值对\(m\)取模后有几种可能。
思路:
由裴蜀定理易得,答案即为\(\frac m{\gcd(m,a_1,a_2,\ldots,a_n)}\)。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=101;
int a[N];
int main() {
const int n=getint(),m=getint();
int gcd=m;
for(register int i=1;i<=n;i++) {
a[i]=getint()%m;
gcd=std::__gcd(gcd,a[i]);
}
printf("%d\n",m/gcd);
return 0;
}
B-字符路径
题目大意:
给一个含\(n\)个点\(m\)条边的有向无环图(允许重边,点用\(1\)到\(n\)的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号'.'结尾,中间都是小写字母,小写字母可以为\(0\)个。
思路:
拓扑序上DP,记录每个点可以对应多少个大写字母开头的字符串,若在前面加上空格有多少种方案,在后面加上空格有多少种方案(反图)。若当前边为'.'则计算对答案的贡献。
源代码:
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
inline int getch() {
register char ch=getchar();
while(!isalpha(ch)&&ch!='_'&&ch!='.') ch=getchar();
return ch;
}
const int N=5e4+1;
struct Edge {
int to;
char w;
};
std::vector<Edge> e[N],e2[N];
inline void add_edge(const int &u,const int &v,const char &w) {
e[u].push_back((Edge){v,w});
}
inline void add_edge2(const int &u,const int &v,const char &w) {
e2[u].push_back((Edge){v,w});
}
int n,m,ind[N],outd[N];
unsigned upper[N],space[N],space2[N],ans;
std::queue<int> q;
void kahn2() {
for(register int i=1;i<=n;i++) {
if(outd[i]==0) q.push(i);
}
while(!q.empty()) {
const int &x=q.front();
for(auto &j:e2[x]) {
const int &y=j.to;
const char &w=j.w;
if(w=='_') space2[y]+=space2[x]+1;
if(!--outd[y]) q.push(y);
}
q.pop();
}
}
void kahn() {
for(register int i=1;i<=n;i++) {
if(ind[i]==0) q.push(i);
}
while(!q.empty()) {
const int &x=q.front();
for(auto &j:e[x]) {
const int &y=j.to;
const char &w=j.w;
if(isupper(w)) upper[y]+=space[x]+1;
if(islower(w)) upper[y]+=upper[x];
if(w=='_') {
space[y]+=space[x]+1;
upper[y]+=upper[x];
}
if(w=='.') ans+=upper[x]*(space2[y]+1);
if(!--ind[y]) q.push(y);
}
q.pop();
}
}
int main() {
n=getint(),m=getint();
for(register int i=0;i<m;i++) {
const int u=getint(),v=getint();
const char w=getch();
add_edge(u,v,w);
add_edge2(v,u,w);
ind[v]++;
outd[u]++;
}
kahn2();
kahn();
printf("%u\n",ans);
return 0;
}
D-整数序列
题目大意:
给出一个长度为\(n\)的整数序列\(a_1,a_2,\ldots,a_n\),进行\(m\)次操作,操作分为两类:
- 给出\(l,r,v\),将\(a_{l\sim r}\)分别加上\(v\);
- 给出\(l,r\),询问\(\sum_{i=l}^r\sin(a_i)\)。
思路:
根据三角恒等变换:
\sin(\alpha+\beta)=\sin\alpha\cdot\cos\beta+\cos\alpha\cdot\sin\beta\\
\cos(\alpha+\beta)=\cos\alpha\cdot\cos\beta-\sin\alpha\cdot\sin\beta
\end{align*}
\]
用线段树维护区间\(\sum\sin(a_i)\)和区间\(\sum\cos(a_i)\)即可。
考虑写成复数的形式,\(\cos\)作为实部,\(\sin\)作为虚部。使用std::complex可以很方便的维护。
源代码:
#include<cmath>
#include<cstdio>
#include<cctype>
#include<complex>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
typedef std::complex<double> comp;
const int N=2e5+1;
class SegmentTree {
#define _left <<1
#define _right <<1|1
#define mid ((b+e)>>1)
private:
comp val[N<<2],tag[N<<2];
void push_up(const int &p) {
val[p]=val[p _left]+val[p _right];
}
void push_down(const int &p) {
if(tag[p]==comp(1,0)) return;
val[p _left]*=tag[p];
val[p _right]*=tag[p];
tag[p _left]*=tag[p];
tag[p _right]*=tag[p];
tag[p]=comp(1,0);
}
public:
void build(const int &p,const int &b,const int &e) {
if(b==e) {
const int x=getint();
val[p]=comp(cos(x),sin(x));
return;
}
tag[p]=comp(1,0);
build(p _left,b,mid);
build(p _right,mid+1,e);
push_up(p);
}
void modify(const int &p,const int &b,const int &e,const int &l,const int &r,const comp &x) {
if(b==l&&e==r) {
tag[p]*=x;
val[p]*=x;
return;
}
push_down(p);
if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r),x);
if(r>mid) modify(p _right,mid+1,e,std::max(mid+1,l),r,x);
push_up(p);
}
double query(const int &p,const int &b,const int &e,const int &l,const int &r) {
if(b==l&&e==r) return val[p].imag();
push_down(p);
double ret=0;
if(l<=mid) ret+=query(p _left,b,mid,l,std::min(mid,r));
if(r>mid) ret+=query(p _right,mid+1,e,std::max(mid+1,l),r);
return ret;
}
#undef _left
#undef _right
#undef mid
};
SegmentTree t;
int main() {
const int n=getint();
t.build(1,1,n);
const int m=getint();
for(register int i=0;i<m;i++) {
const int opt=getint(),l=getint(),r=getint();
if(opt==1) {
const int x=getint();
t.modify(1,1,n,l,r,comp(cos(x),sin(x)));
}
if(opt==2) {
printf("%.1f\n",t.query(1,1,n,l,r));
}
}
return 0;
}
Wannafly挑战赛22游记的更多相关文章
- Wannafly挑战赛25游记
Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...
- Wannafly挑战赛24游记
Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...
- Wannafly挑战赛 22
爆零祭 T1 这题第一反应gcd啊 所以就把每个a[i]对m取模 然后求它们的gcd 即res = gcd(a[1] % m, a[2] % m, ... , a[n] % m) ans = 1 + ...
- Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询
题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 多项式 Wannafly挑战赛22
后缀表达式 大整数(加法.乘法.gcd java) import java.math.BigInteger; import java.util.Scanner; class Work { String ...
- Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)
原题地址 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能. 输入描述: ...
- Wannafly挑战赛22
B. 字符路径 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号 '.' ...
- Wannafly挑战赛22 C 多项式(大数,多项式极限)
链接:https://ac.nowcoder.com/acm/contest/160/C 来源:牛客网 多项式 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...
- Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)
链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...
随机推荐
- java创建并配置多module的maven项目
1 使用idea创建(推荐) 这篇博客写的特别好,很详细: https://blog.csdn.net/sinat_30160727/article/details/78109769 2 使用ecli ...
- Java Dom对XML的解析和修改操作
与Dom4J和JDom对XML的操作类似,JDK提供的JavaDom解析器用起来一样方便,在解析XML方面Java DOM甚至更甚前两者一筹!其不足之处在于对XML的增删改比较繁琐,特开篇介绍... ...
- MVC中检测到有潜在危险的 Request.Form 值
在做mvc项目时,当使用xhedit or.ueditor编辑器时,点击提交时,编辑器中的内容会带有html标签提交给服务器,这时就是会报错,出现如下内容: “/”应用程序中的服务器错误. 从客户端( ...
- spring boot 测试用例
junit 是一个面向于研发人员使用的轻量的测试模块,适合做单元测试.而testng百度后发现更强大,可以做功能测试,但对于我这种RD,貌似junit足沟了呢! java Mock PowerMock ...
- Unity3D Instantiate慢的问题
1.NGUI直接打开界面卡 2.角色放技能的时候卡 3.载入模型的时候卡 http://www.xuanyusong.com/archives/2925
- xgboost gbdt特征点分烈点
lightGBM与XGBoost的区别:(来源于:http://baijiahao.baidu.com/s?id=1588002707760744935&wfr=spider&for= ...
- java基础34 泛型的使用
本文知识点(目录): 1.泛型的好处 2.泛型在集合中的常见应用(这里只用String类型举例) 3.在泛型中是不能使用基本数据类型,如果需要使用基本数据类型,那么就使用基本数据类型对应的 ...
- ZOJ 3469 Food Delivery(区间DP好题)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4255 题目大意:在x轴上有n个客人,每个客人每分钟增加的愤怒值不同. ...
- (二)SpringMVC控制器
第一节:@RequestMapping请求映射 第二节:@RequestParam请求参数 第三节:ModelAndView返回模型和视图 第四节:SpringMVC对象属性自动封装 第五节:Spri ...
- 2015309南皓芯《Java程序设计》实验一(Java开发环境的熟悉)实验报告
一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹):打开windows下的cmd → 输入cd Code命令进入Code目录 → 输入md 20 ...