```cpp #include <bits/stdc++.h> using ll = long long; using ull = unsigned long long; const int N = (2e5) + 5; const double pi2 = 2 * M_PI; // 2*圆周率pi using namespace std;
struct point { int id; // 序号 int z; // 碰到增加的值 ull r; // 半径的平方 double angle; // 角度(以从y轴正方向开始的顺时针角度表示) bool operator>(const point &other) const { return angle > other.angle; // 优先队列按角度排序 } } p[N];
int main() { int n;//棒的个数 ull l;//棒的长度 __int128 l2;//棒的长度的平方,棒的长度的平方。__int128防止超过数据范围 scanf("%d%lld", &n, &l); l2 = l * l; ll x, y; for (int i = 0; i < n; i++) { scanf("%lld%lld%d", &x, &y, &p[i].z); p[i].id = i; p[i].r = x * x + y * y;//半径的平方 p[i].angle = atan2(x, y);//算角度。atan2可以处理为0的情况,注意是顺时针从y轴正方向开始 if (p[i].angle < 0)//把第二、三象限的角度转过来 p[i].angle = pi2 + p[i].angle; } sort(p, p + n, [](const point &a, const point &b) -> bool { return a.r < b.r; });//按半径排序 priority_queue<point, vector<point>, greater<>> q; // 按角度排序的优先队列 int pos; for (pos = 0; pos < n && p[pos].r <= l2; pos++) { q.push(p[pos]); }
#include<bits/stdc++.h> #define pay second #define num first usingnamespace std; using ll = longlong; #define int long long // 十年oi一场空,不开 long long见祖宗 typedef pair<int, int> pp;
signedmain() { ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr); // 正式比赛不要用这两行,用scanf和printf int n, s; cin >> n >> s; vector<pair<int, int>> arr(n); for (int i = 0; i < n; i++) { cin >> arr[i].pay >> arr[i].num; } sort(arr.begin(), arr.end()); int single_paid = 0, sum = 0, i; for (i = n - 1; i >= 0; i--) { single_paid += arr[i].pay; if (single_paid >= s) // 从第i个开始往前,集体训练更便宜,使用集体训练 { break; } } int c; if (i == -1) // 全都是单独训练便宜 { i = 0; c = 0; } else { c = arr[i].num; } sum = c * s; for (int j = i; j < n; j++) { sum += arr[j].pay * (arr[j].num - c); } cout << sum << endl; return0; }
#include<bits/stdc++.h> usingnamespace std; #define N 400005 #define int long long
int t[N]; // 线段树的值(和) int a[N]; // 原始数组 int lazy[N]; // 懒惰标记
// 构造函数:初始化原始数组,构建线段树 voidbuild(int l, int r, int p){ if (l == r) {//区间长度为1 t[p] = a[l]; return; } int mid = l + ((r - l) >> 1); //中分mid=(l+r)/2 int lc = (p << 1), rc = lc | 1;//左子树lc=p*2,右子树rc=lc+1 build(l, mid, lc); //左递归建树 build(mid + 1, r, rc); //右递归建树 t[p] = t[lc] + t[rc]; //求和 }
voidinit(int n){ for (int i = 1; i <= n; i++) { cin >> a[i]; } build(1, n, 1); // 构建线段树 }
// 区间加法操作,对区间[l,r]加上c voidadd(int l, int r, int i, int j, int p, int c){ if (l <= i && j <= r) { //[i,j]在更新区间[l,r]里 t[p] += (j - i + 1) * c;//该区间[i,j]更新求和 lazy[p] += c; //懒惰标记,先不往子树更新,等下一次操作再说 return; } int mid = i + ((j - i) >> 1); //中分mid=(l+r)/2 int lc = (p << 1), rc = lc | 1;//左子树lc=p*2,右子树rc=lc+1 if (lazy[p] && i != j) { //已经有懒惰标记,而且长度大于1 t[lc] += lazy[p] * (mid - i + 1);//左子树更新和 t[rc] += lazy[p] * (j - mid);//右子树更新和 lazy[lc] += lazy[p];//左子树更新懒惰标记 lazy[rc] += lazy[p];//右子树更新懒惰标记 lazy[p] = 0;//清除懒惰标记 } if (l <= mid) add(l, r, i, mid, lc, c); //左子树递归更新 if (mid < r) add(l, r, mid + 1, j, rc, c);//右子树递归更新 t[p] = t[lc] + t[rc]; }
// 区间求和操作,求[l,r]的和 intgetsum(int l, int r, int i, int j, int p){ if (l <= i && j <= r) return t[p];//[i,j]在[l,r]里,直接查询 int mid = i + ((j - i) >> 1); //中分mid=(l+r)/2 int lc = (p << 1), rc = lc | 1; //左子树lc=p*2,右子树rc=lc+1 if (lazy[p]) { //有未更新的懒惰标记 t[lc] += lazy[p] * (mid - i + 1);//左子树更新和 t[rc] += lazy[p] * (j - mid); //右子树更新和 lazy[lc] += lazy[p]; //左子树更新懒惰标记 lazy[rc] += lazy[p]; //右子树更新懒惰标记 } lazy[p] = 0;//清除懒惰标记 int sum = 0; if (l <= mid) sum = getsum(l, r, i, mid, lc);//左子树递归求和 if (mid < r) sum += getsum(l, r, mid + 1, j, rc);//右子树递归求和 return sum; }
signedmain(){ ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr); int n, m, x, y, cmd, k; cin >> n >> m; // 创建并初始化线段树 init(n); // 处理操作 while (m--) { cin >> cmd; if (cmd == 1) { cin >> x >> y >> k; add(x, y, 1, n, 1, k); // 对区间 [x, y] 加上 k } else { cin >> x >> y; cout << getsum(x, y, 1, n, 1) << endl; // 查询区间 [x, y] 的和 } } return0; }
#include<bits/stdc++.h> usingnamespace std; constint N = 1e5 + 5, M = 4e5 + 5; using ll = longlong; #define int long long int n, m, q, t[M], a[N], lazy1[M], lazy2[M];//乘法、加法懒标记 voidbuild(int l, int r, int p) { lazy1[p]=1; if (l == r) { t[p] = a[l] % m; return; } int mid = l + ((r - l) >> 1), lc = p << 1, rc = lc | 1; build(l, mid, lc); build(mid + 1, r, rc); t[p] = (t[lc] + t[rc]) % m; } inlinevoidupdate(int i,int j,int p,int mid,int lc,int rc) { t[lc] = (t[lc] * lazy1[p] % m + lazy2[p] * (mid - i + 1) % m) % m; // 算出来 t[rc] = (t[rc] * lazy1[p] % m + lazy2[p] * (j - mid) % m) % m; lazy1[lc] = lazy1[lc] * lazy1[p] % m; lazy1[rc] = lazy1[rc] * lazy1[p] % m; lazy2[lc] = (lazy2[lc] * lazy1[p] % m + lazy2[p]) % m; lazy2[rc] = (lazy2[rc] * lazy1[p] % m + lazy2[p]) % m; lazy1[p] = 1; lazy2[p] = 0; } voidadd(int l, int r, int i, int j, int p, int k) { if (l <= i && j <= r) { t[p] = (t[p] + (j - i + 1) * k % m) % m; lazy2[p] = (lazy2[p] + k) % m; return; } int mid = i + ((j - i) >> 1), lc = p << 1, rc = lc | 1; update(i,j,p,mid,lc,rc); if (l <= mid) add(l, r, i, mid, lc, k); if (mid < r) add(l, r, mid + 1, j, rc, k); t[p] = (t[lc] + t[rc]) % m; } voidmul(int l, int r, int i, int j, int p, int k) { if (l <= i && j <= r) { t[p] = t[p] * k % m; lazy1[p] = lazy1[p] * k % m; lazy2[p] = lazy2[p] * k % m; return; } int mid = i + ((j - i) >> 1), lc = p << 1, rc = lc | 1; update(i,j,p,mid,lc,rc); if (l <= mid) mul(l, r, i, mid, lc, k); if (mid < r) mul(l, r, mid + 1, j, rc, k); t[p] = (t[lc] + t[rc]) % m; } intgetsum(int l, int r, int i, int j, int p) { if (l <= i && j <= r) { return t[p]; } int mid = i + ((j - i) >> 1), lc = p << 1, rc = lc | 1; update(i,j,p,mid,lc,rc); int sum = 0; if (l <= mid) sum = getsum(l, r, i, mid, lc); if (mid < r) sum += getsum(l, r, mid + 1, j, rc); return sum % m; } signedmain() { ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr); cin >> n >> q >> m; for (int i = 1; i <= n; i++) cin >> a[i]; build(1, n, 1); int cmd, l, r, k; while (q--) { cin >> cmd; switch (cmd) { case1: cin >> l >> r >> k; mul(l, r, 1, n, 1, k % m); break; case2: cin >> l >> r >> k; add(l, r, 1, n, 1, k % m); break; default: cin >> l >> r; cout << getsum(l, r, 1, n, 1) << endl; break; } } return0; }
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> <!-- ALL-CONTRIBUTORS-BADGE:END --> <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- ALL-CONTRIBUTORS-LIST:END -->