首页 > 其他分享 >SMU Winter 2024 div2 ptlks的周报Week 5(3.4-3.10)

SMU Winter 2024 div2 ptlks的周报Week 5(3.4-3.10)

时间:2024-03-10 15:23:24浏览次数:28  
标签:Week Winter 3.10 cin long int while 500005 define

维护子树的全部子树的权值和时,需要用到树的DFS序列,树的每个子树都对应DFS序列中的连续一段

黄金树影

题意:给定一棵树及每个节点的权值,给定一组操作,输入 1 a x ,表示节点a权值加上x;输入 2 a ,表示询问节点a的子树权值和(包含a)。

考虑到树的DFS序列,则问题转变为对某个序列维护区间和以及单点修改,这里通过树状数组来维护。

代码

#include <bits/stdc++.h>
#define int long long
#define MOD 998244353
using namespace std;

int a[500005]={0};
int t[500005]={0};
int p[500005]={0};
int b[500005]={0};
int c[500005]={0};
int tms=1,n;
vector<int>g[500005];
vector<int>vis(500005,0);

int lowbit(int x){
	return x&-x;
}

int getsum(int x) {
	int ans = 0;
	while (x > 0) {
		ans = ans + c[x];
		x = x - lowbit(x);
	}
	return ans;
}

void add(int x, int k) {
	while (x <= n) {
		c[x] = c[x] + k;
		x = x + lowbit(x);
	}
}

void dfs(int x){
	vis[x]=1;
	t[tms]=x;
	p[x]=tms;
	tms++;
	for(int i=0;i<g[x].size();i++){
		if(!vis[g[x][i]]){
			dfs(g[x][i]);
			vis[g[x][i]]=0;
		}
	}
	b[x]=tms-1;
}

int32_t main() {
	int T = 1;
	//cin >> T;
	while (T--) {
		int m;
		cin>>n>>m;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		for(int i=2;i<=n;i++){
			int u;
			cin>>u;
			g[i].emplace_back(u);
			g[u].emplace_back(i);
		}
		dfs(1);
		for(int i=1;i<=n;i++){
			add(i,a[t[i]]);
		}
		for(int i=0;i<m;i++){
			int x,y;
			cin>>x>>y;
			if(x==1){
				int k;
				cin>>k;
				add(p[y],k);
			}else{
				cout<<getsum(b[y])-getsum(p[y]-1)<<endl;
			}
		}
	} 
}

当题目中出现n过大的情况且涉及位运算时,可以考虑逐位处理。

xor^2

题意:求\(\displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^n(i xor j)\),\((1\leq n\leq 10^{18})\)

逐位考虑,若第i位出现1的个数为\(a[i]\),则第i位对答案的贡献为\(a[i]*(n-a[i])*2*2^i\),注意不要超过数据范围即可。

#include <bits/stdc++.h>
#define int long long
#define MOD 998244353
using namespace std;

int32_t main() {
	int T = 1;
	cin >> T;
	while (T--) {
		int a[10086];
		int n,s=0;
		cin >> n;
		int x=0,p=n;
		while(p){
			a[x]=p%2;
			x++;
			p>>=1;
		}
		for(int i=0;i<x;i++){
			a[i]=n/(1ll<<(i+1))*((1ll<<(i)));
			if(n%(1ll<<(i+1))>=(1ll<<(i))){
				a[i]+=n%(1ll<<(i))+1;
			}
			s+=a[i]%MOD*(((n-a[i]))%MOD)%MOD*2%MOD*((1ll<<(i))%MOD)%MOD;
			s%=MOD;
		}
		cout<<s<<endl;
	} 
}

对于质因数分解相关的问题,可以只枚举\(\sqrt{n}\)范围内的素数来减小时间复杂度,也可通过筛法来求素数再次减小时间复杂度

求除数

题意:给定n,求n的因数的个数\((1\leq n\leq 10^8)\)

有多组数据,所以先计算\((1, 10^4)\)范围内素数,可通过欧拉筛来求,再对每个n枚举素数分解质因数,最后输出即可。

#include <bits/stdc++.h>
#define int long long
#define MOD 1000000007
using namespace std;

int pos=0;
vector<int> q(10005),p(10005,1);

void prime(int x){
	p[0]=0,p[1]=0;
	for(int i=2;i<=x;i++){
		if(p[i]){
			q[pos]=i;
			pos++;
		}
		for(int j=0;j<pos;j++){
			if(i*q[j]>x)break;
			p[i*q[j]]=0;
			if(i%q[j]==0)break;
		}
	}
}

int32_t main() {
	int T = 1;
	cin >> T;
	prime(1e4);
	while (T--) {
		int n,s=1;
		cin>>n;
		for(int i=0;i<pos;i++){
			int x=0;
			while(n%q[i]==0){
				n/=q[i];
				x++;
			}
			s*=(x+1);
			if(n==1)break;
		}
		if(n>1){
			s*=2;
		}
		cout<<s<<endl;
	}
}

标签:Week,Winter,3.10,cin,long,int,while,500005,define
From: https://www.cnblogs.com/ptlks/p/18064218

相关文章

  • Weekly Contest 387
    ProblemADistributeElementsIntoTwoArraysI思路按照题意模拟即可.代码classSolution{publicint[]resultArray(int[]nums){intn=nums.length;int[]ans=newint[n];int[]arr1=newint[n];int[]arr2=newint[......
  • 3.4-3.10周报
    周二天梯训练赛天梯选拔赛一A这个题就是每次看到'.',就在它后面放一串英文字符"xixixixi."L其实就是看完整过了多少个视频,以及剩下的那个视频有没有播放到第m秒。J这个题wa了六发,好离谱,题读错了,其实就是每次都减去当前这个数字里任意一个数位,那我们就能有一个贪心思路,每次......
  • NewStarCTF 2023 公开赛道 做题随笔(WEEK1|MISC部分)
    第一题下载打开得到TXT文件好的看样子应该是base32,复制到base在线转换看看得到这玩意 base58转换得到 出了flag  第二题 下载得到一张二维码用隐写软件试试得到一张这个以为是摩斯密码,试试得到有个这玩意,嘶,好像不是试试LSB 得到flag 第三题......
  • 3. 寄存器(内存) | 问题 3.7 - 3.10
    问题3.7编程,将10000H  ~  1000FH做为连本带利,初始状态是空的,将AX,BX,DS中的数据入栈。#初始化SS,SPss=1000H[sp]=[0010],则[ssss:sp]=[1000H:0010H]movax,1000movss,ax#sp是指针,不是段寄存器,可以直接传数据,不用ax中转movsp,0010pushaxpushbxpu......
  • Week 2 Problems
    T1代换式、替换式求代换式\((P\rightarrow(P\rightarrowQ))[P/P\rightarrowR]\)求替换式\((P\lorR\rightarrowP\lorR\landS)[(P\lorR)/(P\landR)]\)已知\(P,Q,R,S\)是命题逻辑合式公式,\(P\)是\(Q\)的子公式,\(R\)不是\(Q\)的子公式,用\(Q^1\equivQ[P/R]\)和「替......
  • NewStar Week2-3部分pwn wp
    stack_migrationchecksec开启了NX保护,但是没有PIE和Canary代码审计可以看到有两个read和一个printf。第一个read没什么用我们看第二个。因为v2距离rbp有0x50个字节,而read只能读入0x60个字节,意味着我们剩余的字节数只有0x10,没法构造完整的ROP链,那么我们就只能利用栈迁移来变......
  • HNCTF 2022 WEEK2
    [HNCTF2022WEEK2]e@sy_flower发现花指令changetype90nop掉在主函数p重构,然后就可以反编译了编写脚本enc="c~scvdzKCEoDEZ[^roDICUMC"flag=[1]*24forjinrange(24):flag[j]=chr(ord(enc[j])^48)foriinrange(12):v5=flag[2*i+1]......
  • AwesomeTechnologyWeekly 值的关注的中文社区优质技术周刊一览
    作为开发者,我们每天都需要吸收大量的信息补充我们的知识体系.AwesomeTechnologyWeeklyZh-Hans项目收集了中文技术社区各个领域的高质量的中文技术月/周/日刊,定时刷新获取最新一期中文技术月/周/日刊进行展示.访问网站开始关注吧~:https://shansan.top/awesome-tech-weekly-......
  • HNCTF 2022 WEEK1
    [HNCTF2022Week1]超级签到str2是编写脚本str2='{hello_world}'print(str2.replace(chr(111),chr(48)))#{hell0_w0rld}[HNCTF2022Week1]贝斯是什么乐器啊?enc为码表为脚本为a="NRQ@PAu;8j[+(R:2806.i"flag=""foriinrange(len(a)):fla......
  • 3.1~3.10解题报告
    [cf1525E]AssimilationIV依据题面,可以知道每个点只会被计算一次,所以可以从点出发,求每个点被覆盖的概率,正着计算会有很多重复,所以考虑先算出不可能的情况,在与1作差,很明显,若所有城市到点A的距离都小于n,则一定成立,如果有一个不满足,则若此城市第一个放置,就要分两种情况,若其余距离均......