首页 > 其他分享 >SMU 2024 ptlks的周报Week 8(7.8-7.14)

SMU 2024 ptlks的周报Week 8(7.8-7.14)

时间:2024-07-14 21:41:31浏览次数:10  
标签:Week 7.14 10 int SMU long build mx define

这周主要学习了线段树,基本能用线段树解决一些简单的题目。

D - Flat Subsequence

题意:单点修改+区间查询

代码

#include <bits/stdc++.h>
#define int long long
#define mod 998244353
#define PII pair<int,int>
#define PIII pair<int,PII>
#define double long double
#define lson u<<1
#define rson u<<1|1
#define endl '\n'
#pragma GCC optimize(3,"Ofast","inline")

using namespace std;

const int N = 3e5 + 5, SZ = N << 2;
int val[N];
int a[N], pos[N], n, k;
vector<int>dp(N), dp1(N);
struct node {
	int mx, l, r;
} t[SZ];

void pushup(int u) {
	t[u].mx = max(t[lson].mx, t[rson].mx);
}

void build(int l = 1, int r = N, int u = 1) {
	t[u].l = l;
	t[u].r = r;
	if (l == r) {
		pos[l] = u;
		t[u].mx = a[l];
		return;
	}
	int mid = l + r >> 1;
	build(l, mid, lson);
	build(mid + 1, r, rson);
	pushup(u);
}
void add(int l, int x) {
	int u = pos[l];
	if (t[u].mx < x) {
		t[u].mx = x;
		while (u >>= 1)pushup(u);
	}

}

int getmax(int L, int R, int l = 1, int r = N, int u = 1) {
	if (L <= l && r <= R) {
		return t[u].mx;
	}
	int mid = l + r >> 1;
	int mx = 0;
	if (L <= mid)mx = max(mx, getmax(L, R, l, mid, lson));
	if (R > mid)mx = max(mx, getmax(L, R, mid + 1, r, rson));
	pushup(u);
	return mx;
}

void solve() {
	int n;
	cin >> n >> k;
	build();
//	cout<<n<<' '<<k<<endl;
	for (int i = 1; i <= n; i++) {
		cin>>val[i];
//		val[i] = 1;
		val[i]++;
		int l = max(1ll, val[i] - k);
		int r = min(N, val[i] + k);
		int mx = getmax(l, r);
//		cout<<"mx"<<mx<<endl;
		add(val[i], mx + 1);
	}
	cout << getmax(1, N) << endl;

}

int32_t main() {
//	std::ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);

	int T = 1;
	//cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

D. Traffic Jams in the Land

题意:单点修改+区间查询

代码

#include <bits/stdc++.h>
#define int long long
#define mod 1000000007
#define PII pair<int,int>
#define PIII pair<int,PII>
#define double long double
#define endl '\n'
#pragma GCC optimize(3,"Ofast","inline")


using namespace std;

const int N = 1e5 + 5, SZ = N << 2;

int n, m, k;
int a[N], pos[SZ];

struct data {
	int val[60];
	int l, r;
} t[SZ];

void pushup(int u) {
	for (int i = 0; i < 60; i++) {
		t[u].val[i] = t[u << 1].val[i] + t[u << 1 | 1].val[(i + t[u << 1].val[i]) % 60];
	}
}


void build(int u = 1, int l = 1, int r = n) {
	t[u].l = l;
	t[u].r = r;
	if (l == r) {
		pos[l] = u;
		for (int i = 0; i < 60; i++) {
			t[u].val[i]++;
			if (i % a[l] == 0) {
				t[u].val[i]++;
			}
		}
		return;
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	pushup(u);
}

void add(int L, int v) {
	int u = pos[L];
	for (int i = 0; i < 60; i++) {
		t[u].val[i] = 1;
		if (i % v == 0) {
			t[u].val[i]++;
		}
	}
	while (u >>= 1)pushup(u);
}

int qsum(int L, int R, int T, int u = 1, int l = 1, int r = n) {
	if (R < l || r < L) return 0;
	if (L <= l && r <= R) {
		return t[u].val[T % 60];
	}


	int mid = (l + r) >> 1;
	int ans = 0;
	if (L <= mid)   ans = ans + qsum(L, R, T, u << 1, l, mid);
	if (R > mid)    ans = ans + qsum(L, R, T + ans, u << 1 | 1, mid + 1, r);
	return ans;
}


void solve() {
	cin >> n;

	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	build();
	cin >> m;
	for (int i = 0; i < m; i++) {
		char x;
		int l, r;
		cin >> x >> l >> r;
		if (x == 'A') {
			cout << qsum(l, r - 1, 0) << endl ;
		} else {
			add(l, r);
		}
	}
}

int32_t main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T = 1;
	//cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

仓鼠的鸡蛋

题意:将数据二分插入线段树

代码

#include <bits/stdc++.h>
#define int long long
#define mod 1000000007
#define PII pair<int,int>
#define PIII pair<int,PII>
#define double long double
#define endl '\n'
#pragma GCC optimize(3,"Ofast","inline")

using namespace std;

const int N = 3e5 + 5, SZ = N << 2;

int n, m, k;
int a[N],cnt[SZ];

struct data {
	int mx,l,r;
} t[SZ];

void pushup(int u) {
	t[u].mx = max(t[u << 1].mx , t[u << 1 | 1].mx);
}


void build(int u = 1, int l = 1, int r = n) {
	t[u].l=l;t[u].r=r;
	if (l == r) {
		t[u].mx =m;
		cnt[l]=0;
		return;
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	pushup(u);
}

int add(int v, int u = 1, int l = 1, int r = n) {
	while(t[u].l<t[u].r){
		if(t[u<<1].mx>=v)u<<=1;
		else u=(u<<1|1);
	}
	t[u].mx-=v;
	int ans=t[u].l;
	cnt[t[u].l]++;
	if(cnt[t[u].l]>=k)t[u].mx=0;
	while(u>>=1)pushup(u);
	return ans;
}



void solve() {
	cin >> n >> m >> k;
	build();
	for (int i = 1; i <= n; i++) {
		int x;
		cin>>x;
		if(x<=m)cout<<add(x)<<endl;
		else cout<<-1<<endl;
	}
}

int32_t main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

势能线段树模板题一

题意:势能线段树模版,感觉很难用得上。。

代码

#include <bits/stdc++.h>
#define int long long
#define mod 1000000007
#define PII pair<int,int>
#define PIII pair<int,PII>
#define double long double
#define endl '\n'
#pragma GCC optimize(3,"Ofast","inline")


using namespace std;

const int N = 2e5 + 5, SZ = N << 2;

int n, m, k;
int a[N], pos[SZ];

struct data {
	int max, min,sum;
	int tsq;
	int l, r;
} t[SZ];

void pushup(int u) {
//	cout<<"pp"<<endl;
	t[u].sum=(t[u<<1].sum+t[u<<1|1].sum);
	t[u].max=max(t[u<<1].max,t[u<<1|1].max);
	t[u].min=min(t[u<<1].min,t[u<<1|1].min);
}


void build(int u = 1, int l = 1, int r = n) {
	t[u].l = l;
	t[u].r = r;
	t[u].tsq=0;
	if (l == r) {
		pos[l] = u;
		t[u].sum=a[l];
		t[u].max=t[u].min=a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	pushup(u);
}

void sq(int L, int R, int u = 1, int l = 1, int r = n) {
	
	if(t[u].max<=1)return;
	if(l==r){
		t[u].max=sqrt(t[u].max);
		t[u].min=sqrt(t[u].min);
		t[u].sum=t[u].max;
		return ;
	}
	int mid=l+r>>1;
	if(L<=mid){
		sq(L,R,u<<1,l,mid);
	}
	if(R>mid){
		sq(L,R,u<<1|1,mid+1,r);
	}
	pushup(u);
}

int qsum(int L, int R, int u = 1, int l = 1, int r = n) {
//	cout<<"qsum("<<L<<','<<R<<','<<T<<','<<u<<','<<l<<','<<r<<")"<<endl;
	if (L <= l && r <= R) {
//		cout<<'l'<<l<<r<<' '<<T<<endl;
//		cout<<min(T,m)%k<<' '<<t[u].val[min(T,m)%k]<<endl;
//		cout << "return " << t[u].val[min(T, m) % k] << endl;
		return t[u].sum;
	}
	
	
	int mid = (l + r) >> 1;
	int ans = 0;
	if (L <= mid)   {
		ans = ans + qsum(L, R, u << 1, l, mid);
		
	}
//	cout<<'b'<<l<<' '<<r<<ans<<endl;
//	cout<<"md"<<md<<endl;
	if (R > mid)    ans = ans + qsum(L, R,  u << 1 | 1, mid + 1, r);
//	cout<<'a'<<l<<' '<<r<<ans<<endl;
//	cout << "return " << ans << endl;
	return ans;
}


void solve() {
	cin >> n >> m ;
	
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	build();

	for (int i = 0; i < m; i++) {
		int x;
		int l, r;
		cin >> x >> l >> r;
		if (x == 1) {
			sq(l, r);
		} else {
			cout << qsum(l, r) << endl;
		}
	}
}

int32_t main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T = 1;
	//cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}
/*
  10 5
  10 10 10 10 10 10 10 10 10 10
  1 1 7
  2 1 10
  1 4 10
  2 1 1
  1 1 10*/

标签:Week,7.14,10,int,SMU,long,build,mx,define
From: https://www.cnblogs.com/ptlks/p/18302051

相关文章

  • SMU Summer 2024 第一周周报 (zhaosang)
    学到了很多,不仅仅是学习方面的,在学校学跟在家寒假对比,天差地别吧。补题的过程中收获满满,最近练习二分三分,栈队列单调栈等习题,题目不简单,努力学习中。。打比赛也是,也有打的很惨的时候,我自己需要多总结找出原因,把短板补齐。总的来说,这个星期很累,但很爽!星期一:https://www.cnblogs......
  • SMU Summer 2024 Contest Round 2 (7.9)zhaosang
    A-Ahttp://162.14.124.219/contest/1006/problem/A考查用vector画图我枚举到n==5才开始用,浪费40分钟,还是找规律太慢,得多学做题代码如下:一坨#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constllN=1e6+8;charv[1000001];intw[10000001];ll......
  • SMU Summer 2024 Contest Round 3(7.10)zhaosang
    打的最菜一次,最惨一次,题读假了A-Ahttp://162.14.124.219/contest/1007/problem/A签到题要解决这道题,素数对,数据量不是很大,所以我们可以先预处理素数,这个偶数肯定是等于小于它的两个素数,所以只需要遍历到小于它即可,把素数存起来,然后这两个素数的和等于这个偶数,并且要求相差最小......
  • 2024.07.14模拟赛总结
    前言:又上头了T1赛时做法:首先,假设对答案做出贡献的是点x,y,设y的祖先且为x的儿子的点为z,那么显然,把除了z以外的所有都归入集合是最优的,因为这不会影响对y的统计且尽量满足了限制于是就枚举点x但这时,我不会了,我知道启发式合并可以做,但我不会(忘了),于是我想线段树合并,事实证明,还是有......
  • week4
    week4XXE注入[NCTF2019]FakeXMLcookbook考点:xxe漏洞知识点:漏洞原理:发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起DOS攻击等危害。XXE漏洞触发的点往往是可以上传XML文件的位置,没......
  • [HNCTF 2022 WEEK2]ez_SSTI
    [HNCTF2022WEEK2]ez_SSTIpayload:?name={{''.__class__.__base__.__subclasses__()[137].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("catflag").read()')}}1.首先输入{{8*8}}判......
  • SMU Summer 2024 Contest Round 3
    1.To3原题链接:http://162.14.124.219/contest/1007/problem/I记录数组中除3余数的种类和个数,以及数组元素总和除3的余数,最后判断(考虑总余数为1,两个元素余数为2和总余数为2,两个元素余数为1的特殊情况)查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespa......
  • SMU Summer 2024 Contest Round 2
    1.MinimumWidth原题链接:http://162.14.124.219/contest/1006/problem/C二分一行最大容量,如果check小于等于总行数就扩大,反之则缩小查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;inta[1000000],b[1000000];boolcheck(intx){......
  • SMU Summer 2024 Contest Round 3(7.10)
    寻找素数对思路:数的范围为10000,直接筛出所有范围内的质数,n2的枚举所有质数对和的情况#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definePIIpair<int,int>constintN=1e4+5;vector<int>pri;intidx,st[N];voidinit(){for(in......
  • SMU Summer 2024 Contest Round 3
    SMUSummer2024ContestRound3寻找素数对题意给你一个偶数,找到两个最接近的素数,其和等于该偶数。思路处理出1e5以内的素数,然后遍历,更新最接近的答案。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;vector<int>euler_range(intn){......