#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
string s1, s2;
int dp[505][505];
int main(){
IOS
cin >> s1 >> s2;
memset(dp, 0, sizeof(dp));
int l1 = s1.size(), l2 = s2.size();
for(int i = 1;i <= l1;i++){
for(int j = 1;j <= l2;j++){
if(s1[i - 1] == s2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
cout << dp[l1][l2] << '\n';
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
int main(){
IOS
int arr[100];
int n;
cin >> n;
for(int i = 0;i < n;i++) cin >> arr[i];
int dp[100];
for(int i = 0;i < n;i++) dp[i] = 1;
for(int i = 0;i < n;i++){
for(int j = 0;j < i;j++){
if(arr[i] > arr[j])
dp[i] = max(dp[j] + 1, dp[i]);
}
}
int ans = 1;
for(int i = 0;i < n;i++) ans = max(ans, dp[i]);
cout << ans << '\n';
return 0;
}
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> v;
int n = nums.size();
for(int i = 0;i < n;i++){
int p = lower_bound(v.begin(), v.end(), nums[i]) - v.begin();
if(p == v.size()) v.push_back(nums[i]);
else v[p] = nums[i];
}
return v.size();
}
};
for(int i=0;i<num.size();i++){
if(lis.empty()||lis.back()<num[i]){
lis.push_back(num[i]);
dp[i]=lis.size();
}
else{
auto iter=lower_bound(all(lis),num[i]);
dp[i]=iter-lis.begin()+1;
*iter=num[i];
}
}
int length=lis.size();
for(int i=num.size()-1;i>=0;i--){
if(dp[i]==length){
ans.push_back(num[i]);
length--;
}
}
is_prime = n * [1]
is_prime[0] = is_prime[1] = 0
for i in range(2, n):
if is_prime[i]:
for j in range(2, n):
if i * j >= n:
break
is_prime[i * j] = 0
bitset<MAXN> prime_bool;
vector<ll> prime;
void find_prime(){
prime_bool.set();
for(int i=2;i<MAXN;i++){
if(prime_bool[i]){
prime.push_back(i);
}
for(auto j:prime){
if(j*i>=MAXN)
break;
prime_bool[j*i]=0;
if(i%j==0)
break;
}
}
}
bool prime(int n)
{
if(n<2) return false;
if(n<=3) return true;
if(!(n%2) || !(n%3)) return false;
for(int i=5;i*i<=n;i+=6)
if(!(n%i) || !(n%(i+2))) return false;
return true;
}
def egcd(a: int, b: int) -> Tuple[int, int, int]:
"""return (g, x, y) such that a*x + b*y = g = gcd(a, b)"""
"""x % y"""
if a == 0:
return (b, 0, 1)
else:
b_div_a, b_mod_a = divmod(b, a)
g, x, y = egcd(b_mod_a, a)
return (g, y - b_div_a * x, x)
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1,y=0;
return a;
}
int gcd=exgcd(b,a%b,y,x);
y-=a/b*x;
return gcd;
}
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 2147483647
using namespace std;
int n, m;
vector<pair<int, int>> adj[100005];
bool visited[100005] = {false};
priority_queue<pair<int, int>> pq;
int dis[100005], parent[100005];
void solve(){ // Dijkstra
dis[0] = 0;
for(int i = 1;i < n;i++) dis[i] = INF;
pq.push(make_pair(0, 0));
while(!pq.empty()){
auto node = pq.top();
pq.pop();
int v = node.second; // parent
if(visited[v]) continue;
visited[v] = true;
for(auto i : adj[v]){
int vertex = i.first, weight = i.second;
if(visited[vertex]) continue;
if(dis[v] + weight < dis[vertex]){
dis[vertex] = dis[v] + weight;
parent[vertex] = v;
pq.push(make_pair(-dis[vertex], vertex));
}
}
}
int maxd = -1, cnt = 0;
for(int i = 0;i < n;i++){
if(dis[i] < INF){
if(dis[i] > maxd) maxd = dis[i];
}
else cnt++;
}
cout << maxd << '\n' << cnt << '\n';
}
int main(){
IOS
cin >> n >> m;
for(int i = 0;i < m;i++){
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back(make_pair(v, w));
adj[v].push_back(make_pair(u, w));
}
solve();
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
const int MAXN = 1005;
vector<pii> adj[MAXN]; // adj[u] stores pairs {v, weight}
int dist[MAXN], sec_dist[MAXN]; // shortest and second shortest distances
void dijkstra(int s, int n){
// Min-heap to store {distance, node}
priority_queue<pii, vector<pii>, greater<pii>> pq;
fill(dist, dist + n + 1, INF);
fill(sec_dist, sec_dist + n + 1, INF);
dist[s] = 0;
pq.push({0, s});
while(!pq.empty()) {
int d = pq.top().first;
int u = pq.top().second;
pq.pop();
// If we found a path longer than the second shortest, skip it
if (sec_dist[u] < d) continue;
for (auto &edge : adj[u]){
int v = edge.first;
int w = edge.second;
int new_dist = d + w;
// If this gives a new shortest path to v
if(new_dist < dist[v]){
sec_dist[v] = dist[v];
dist[v] = new_dist;
pq.push({dist[v], v});
pq.push({sec_dist[v], v});
}
// If this gives a new second shortest path to v
else if(new_dist > dist[v] && new_dist < sec_dist[v]){
sec_dist[v] = new_dist;
pq.push({sec_dist[v], v});
}
}
}
}
int main() {
IOS
int t;
cin >> t;
while(t--){
int n, m, s, d;
cin >> n >> m >> s >> d;
// Reset adjacency list
for(int i = 1; i <= n; i++) adj[i].clear();
for(int i = 0; i < m; i++){
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w}); // If the graph is undirected
}
dijkstra(s, n);
if(sec_dist[d] == INF) cout << -1 << '\n'; // No second shortest path
else cout << sec_dist[d] << '\n';
}
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct Edge{
int x, y, t;
};
int dis[1005];
int main(){
IOS
int c;
cin >> c;
while(c--){
vector<Edge> edge;
int n, m;
cin >> n >> m;
for(int i = 0;i <= n;i++) dis[i] = INF;
dis[0] = 0;
for(int i = 0;i < m;i++){
int x, y, t;
cin >> x >> y >> t;
edge.push_back({x, y, t});
}
for(int i = 0;i < n - 1;i++){
for(int j = 0;j < m;j++){
if(dis[edge[j].x] + edge[j].t < dis[edge[j].y]){
dis[edge[j].y] = dis[edge[j].x] + edge[j].t;
}
}
}
bool judge = true;
for(auto e : edge){
if(dis[e.x] + e.t < dis[e.y]){
judge = false;
break;
}
}
cout << (judge ? "not possible" : "possible") << '\n';
}
return 0;
}
#define mem(x) memset(x, 0, sizeof(x))
struct road{
int r, val;
};
int main(){
int n, e, l, r, v;
cin >> n >> e;
vector<int> dp(n + 1, 1e9);
vector<road> rd[n + 1];
for(int i = 0; i < e; i++){
cin >> l >> r >> v;
rd[l].push_back({r, v});
rd[r].push_back({l, v});
}
cin >> l >> r;
dp[l] = 0;
queue<int> que;
que.push(l);
bool check[n + 1]; mem(check);
int cnt[n + 1]; mem(cnt);
while(!que.empty()){
int tmp = que.front(); que.pop();
check[tmp] = 0, cnt[tmp]++;
if(cnt[tmp] >= n) {cout << "neg cycle\n"; break;}
for(auto & i : rd[tmp]){
if(dp[i.r] > dp[tmp] + i.val){
dp[i.r] = dp[tmp] + i.val;
if(!check[i.r]) check[i.r] = 1, que.push(i.r);
}
}
}
for(auto & i : dp) cout << i << ' ';
return 0;
}
int n, rd, l, r, v;
cin >> n >> rd;
vector<vector<int>> dp(n + 1, vector<int>(n + 1, 1e9));
for(int i = 0; i < rd; i++){
cin >> l >> r >> v;
dp[l][r] = dp[r][l] = v;
//每條路皆雙向
}
//以下即 Floyd-Warshall
for(int k = 1; i <= n; i++){
for(int i = 1; j <= n; j++){
for(int j = 1; k <= n; k++){
dp[i][j] = min(dp[i][k] + dp[k][j] , dp[i][j]);
//窮舉所有鬆弛可能
}
}
}
cin >> l >> r;
cout << dp[l][r];
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int n, m, dis[10005], parent[10005];
bool visited[10005] = {false};
vector<pair<int, int> > adj[100005];
int main(){
IOS
// freopen("input.in", "r", stdin);
cin >> n >> m;
memset(dis, 0x3f3f3f3f, sizeof(dis));
memset(parent, -1, sizeof(parent));
for(int i = 0;i < m;i++){
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
int start = 0;
dis[start] = 0;
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > pq;
pq.push({dis[start], start});
while(!pq.empty()){
pair<int, int> cur = pq.top();
pq.pop();
if(visited[cur.second]) continue;
visited[cur.second] = true;
for(auto i : adj[cur.second]){
if(visited[i.first]) continue;
if(dis[i.first] > i.second){
dis[i.first] = i.second;
parent[i.first] = cur.second;
pq.push({dis[i.first], i.first});
}
}
}
int cost = 0, err = 0;
for(int i = 0;i < n;i++){
if(dis[i] < 0x3f3f3f3f) cost += dis[i];
else err++;
}
cout << (err ? -1 : cost) << "\n";
// for(int i = 0;i < n;i++) cout << dis[i] << ' ';
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int parent[10005];
struct Edge{
int u, v, w;
bool operator < (Edge &b){
return w < b.w;
}
};
int query(int a){
if(parent[a] == -1) return a;
return parent[a] = query(parent[a]);
}
bool merge(int a, int b){
int r1 = query(a);
int r2 = query(b);
if(r1 == r2) return false;
if(parent[r1] < parent[r2]) parent[r2] = r1;
else parent[r1] = r2;
return true;
}
int main(){
IOS
int n, m;
memset(parent, -1, sizeof(parent));
cin >> n >> m;
vector<Edge> adj;
for(int i = 0;i < m;i++){
int u, v, w;
cin >> u >> v >> w;
adj.push_back({u, v, w});
}
sort(adj.begin(), adj.end());
// for(int i = 0;i < m;i++) cout << adj[i].w << ' ';
int cost = 0, n_edge = 0;
for(Edge e : adj){
if(merge(e.u, e.v)){
cost += e.w;
n_edge++;
}
}
if(n_edge == n - 1) cout << cost << '\n';
else cout << -1 << '\n';
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int anc[105], sz[105];
struct Edge{
int a, b, c;
};
int Find(int a){
return (anc[a] == a ? a : anc[a] = Find(anc[a]));
}
bool merge(int a, int b){
a = Find(a);
b = Find(b);
if(a == b) return false;
if(sz[a] < sz[b]) swap(a, b);
anc[b] = a;
sz[a] += sz[b];
return true;
}
int main(){
IOS
int t;
cin >> t;
while(t--){
int n, m;
vector<Edge> edge;
cin >> n >> m;
vector<pair<int, int> > vec[105];
for(int i = 0;i < m;i++){
int a, b, c;
cin >> a >> b >> c;
edge.push_back({a, b, c});
}
for(int i = 1;i <= n;i++){
sz[i] = 0;
anc[i] = i;
}
sort(edge.begin(), edge.end(), [&](Edge &u, Edge &v){return u.c < v.c;});
int cost1 = 0, cnt = 0;
vector<int> mst;
for(int i = 0;i < edge.size();i++){
if(merge(edge[i].a, edge[i].b)){
cost1 += edge[i].c;
mst.push_back(i);
if(++cnt == n - 1) break;
}
}
int cost2 = INF;
for(int i = 0;i < mst.size();i++){
cnt = 0;
int res = 0;
for(int i = 1;i <= n;i++) anc[i] = i;
for(int j = 0;j < edge.size();j++){
if(mst[i] == j) continue;
if(merge(edge[j].a, edge[j].b)){
res += edge[j].c;
if(++cnt == n - 1){
cost2 = min(cost2, res);
break;
}
}
}
}
cout << cost1 << ' ' << cost2 << '\n';
}
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int n, q;
vector<int> vec[N];
int p[20][N], in[N], out[N];
bool valid(int a, int b){
return (in[a] <= in[b] && out[b] <= out[a]);
}
void dfs(int cur, int par){
static int t = 0;
p[0][cur] = par;
in[cur] = t++;
for(auto e : vec[cur]){
dfs(e, cur);
}
out[cur] = t++;
}
int lca(int a, int b){
if(valid(a, b)) return a;
for(int i = 19;i >= 0;i--){
if(!valid(p[i][a], b)) a = p[i][a];
}
return p[0][a];
}
int main(){
IOS
cin >> n >> q;
for(int i = 2;i <= n;i++){
int e;
cin >> e;
vec[e].push_back(i);
}
dfs(1, 1);
for(int i = 1;i < 20;i++){
for(int j = 1;j <= n;j++){
p[i][j] = p[i - 1][p[i - 1][j]];
}
}
while(q--){
int u, v;
cin >> u >> v;
cout << lca(u, v) << '\n';
}
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
vector<int> vec[200005];
int ind[100005];
int main(){
IOS
int n, m;
cin >> n >> m;
memset(ind, 0, sizeof(ind));
for(int i = 0;i < m;i++){
int a, b;
cin >> a >> b;
ind[b]++;
vec[a].push_back(b);
}
queue<int> q;
for(int i = 1;i <= n;i++){
if(ind[i] == 0) q.push(i);
}
vector<int> top;
while(!q.empty()){
int cur = q.front();
q.pop();
top.push_back(cur);
for(auto e : vec[cur]){
ind[e]--;
if(ind[e] == 0){
q.push(e);
}
}
}
if(top.size() == n){
for(auto i : top) cout << i << ' ';
cout << '\n';
}
else cout << "IMPOSSIBLE" << '\n';
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define L(x) (x << 1)
#define R(x) ((x << 1) | 1)
using namespace std;
typedef long long ll;
ll seg[500005 << 2], lazy[500005 << 2];
int n, q;
void init(){
memset(seg, 0, sizeof(seg));
memset(lazy, 0, sizeof(lazy));
}
void build(int x, int l, int r){
if(l == r){
cin >> seg[x];
return;
}
int mid = (l + r) >> 1;
build(L(x), l, mid);
build(R(x), mid + 1, r);
seg[x] = seg[L(x)] + seg[R(x)];
}
void push(int pos, int size){
lazy[L(pos)] += lazy[pos];
lazy[R(pos)] += lazy[pos];
seg[pos] = seg[pos] + lazy[pos] * size;
lazy[pos] = 0;
}
void modify(int x, int l, int r, int ql, int qr, int val){
if(lazy[x]) push(x, (r - l) + 1);
// seg[x] = seg[L(x)] + (mid - l) * lazy[L(x)] + seg[R(x)] + (r - mid) * lazy[R(x)];
seg[x] += val * (qr - ql + 1);
if(ql <= l && qr >= r){
lazy[x] += val;
return;
}
int mid = (l + r) >> 1;
if(qr <= mid) modify(L(x), l, mid, ql, qr, val);
else if(ql > mid) modify(R(x), mid + 1, r, ql, qr, val);
else{
modify(L(x), l, mid, ql, mid, val);
modify(R(x), mid + 1, r, mid + 1, qr, val);
}
}
ll query(int x, int l, int r, int ql, int qr){
if(ql <= l && qr >= r) return seg[x] + lazy[x] * (r - l);
if(lazy[x]) push(x, (r - l) + 1);
int mid = (l + r) >> 1;
if(qr <= mid) return query(L(x), l, mid, ql, qr);
else if(ql > mid) return query(R(x), mid + 1, r, ql, qr);
else return query(L(x), l, mid, ql, mid) + query(R(x), mid + 1, r, mid + 1, qr);
}
int main(){
IOS
init();
cin >> n;
build(1, 1, n);
cin >> q;
while(q--){
int v, x, y, k;
cin >> v;
if(v == 1){
cin >> x >> y >> k;
modify(1, 1, n, x, y, k);
}
else{
cin >> x >> y;
ll ans = query(1, 1, n, x, y);
cout << ans << '\n';
}
}
return 0;
}
struct Node{
int left; // 左邊邊界
int right; //右邊邊界
int value; //儲存的值
int z; //區間修改用,如果沒有區間修改就不需要
}node[4 * N ];
#define Lson(x) (x << 1) //左子樹
#define Rson(x) ((x << 1) +1) //右子樹
void question(){
for(int i = 1; i <= 10; i++) num[i] = i * 123 % 5;
// num 為題目產生的一段數列
// hash 函數,讓 num 的 i 被隨機打亂
}
void build(int left , int right , int x = 1 ){
// left 為題目最大左邊界,right 為題目最大右邊界,圖片最上面的 root 為第一個節點
node[x].left = left ; //給 x 節點左右邊界
node[x].right = right ;
if(left == right){ //如果左右邊界節點相同,表示這裡是葉節點
node[x].value = num[left] ; //把 num 值給 node[x]
//這裡的 num 值表示,我們要在 value 要放的值
return ; //向前返回
}
int mid = (left + right ) / 2 ; //切半,產生二元樹
//debug
//cout << mid << '\n' ;
//cout << x << ' ' << node[x].left << ' ' << node[x].right << ' ' << '\n' ;
build(left , mid , Lson(x)) ; //將區間改為 [left, mid] 然後帶給左子樹
build(mid + 1 , right , Rson(x)) ; //將區間改為 [mid+1, right] 然後帶給右子樹
node[x].value = min(node[Lson(x)].value , node[Rson(x)].value ) ;
//查詢左右子樹哪個數值最小,並讓左右子樹最小值表示此區間最小數值。
}
void modify(int position , int value , int x = 1 ){ //修改數字
if(node[x].left == position && node[x].right == position ){ //找到葉節點
node[x].value = value ; //修改
return ; //傳回
}
int mid = (node[x].left + node[x].right ) / 2 ; //切半,向下修改
if(position <= mid ) //如果要修改的點在左邊,就往左下角追蹤
modify(position , value , Lson(x) );
if(mid < position ) //如果要修改的點在右邊,就往右下角追蹤
modify(position , value , Rson(x)) ;
node[x].value = min(node[Lson(x)].value , node[Rson(x)].value );
//比較左右子樹哪個值比較小,較小值為此節點的 value
}
void push_down(int x, int add){ //將懶人標記往下推,讓下一層子樹進行區間修改
int lson = Lson(x), rson = Rson(x);
node[lson].z += add; //給予懶人標記,表示子樹如果要給子樹的子樹區間修改時,
node[rson].z += add; //數值要是多少,左右子樹都需要做
node[lson].v += add; //更新左右子樹的值
node[rson].v += add;
}
void update(int a, int b, int cmd, int x = 1){
//a, b 為區間修改的 left and right, cmd 為要增加的數值
if(a <= node[x].l && b >= node[x].r){
//如果節點的 left and right,跟 a, b 區間是相等,或更小就,只要在這邊修改 cmd,
//就可以讓 node[x].v 的值直接變為區間修改後的數值,
//之後如果要讓這查詢向子樹進行區間修改,就用 push_down,
//我們這邊的懶人標記就會告訴左右子樹要修改的值為多少
node[x].v += cmd; //區間修改後的 v
node[x].z = cmd; //區間修改是要增加多少數值
return;
}
push_down(x);//先將之前的區間查詢修改值,往下給子樹以避免上次的查詢值被忽略
//假如當前的 node[x].z 原本是 3,如果沒有 push_down(x),那下面的子樹都沒有被 +3,
//導致答案不正確。
int mid = (node[x].l+node[x].r) / 2; //切半,向下修改
if(a <= mid) update(a, b, cmd, Lson(x)); //如果要修改的點在左邊,就往左下角追蹤
if(b > mid) update(a, b, cmd, Rson(x)); //如果要修改的點在右邊,就往右下角追蹤
node[x].v = node[Lson(x)].v + node[Rson(x)].v;
//比較左右子樹哪個值比較小,較小值為此節點的 value
}
#define INF 0x3f3f3f
int query(int left , int right , int x = 1 ){
if(node[x].left >= left && node[x].right <= right)
return node[x].Min_Value ;
//如果我們要查詢的區間比當前節點的區間大,那我們不需再向下查詢直接輸出此答案就好。
// 例如我們要查詢 [2, 8],我們只需要查詢 [3, 4],不須查詢 [3, 3]、[4, 4],
// [3, 4] 已經做到最小值查詢
push_down(x);//有區間修改時才需要寫
int mid = (node[x].left + node[x].right ) / 2 ; //切半,向下修改
int ans = INF ; //一開始先假設答案為最大值
if( left <= mid ) //如果切半後,我們要查詢的區間有在左子樹就向下查詢
ans = min(ans , query(left , right , Lson(x))) ; //更新答案,比較誰比較小
if(mid < right ) //如果切半後,我們要查詢的區間有在右子樹就向下查詢
ans = min(ans , query(left , right , Rson(x))) ; //更新答案,比較誰比較小
return ans ; //回傳答案
}
// BIT
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #include <ext/pb_ds/detail/standard_policies.hpp>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
#define lowbit(x) x&(-x)
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
const int N = 2e5 + 5;
ll bit[N], n, q;
ll query(int idx){
ll sum = 0;
for(int i = idx;i > 0;i -= lowbit(i))
sum += bit[i];
return sum;
}
void update(ll val, int idx){
for(int i = idx;i <= n;i += lowbit(i))
bit[i] += val;
}
int main(){
IOS
cin >> n >> q;
for(int i = 1;i <= n;i++){ // 1-based
ll in;
cin >> in;
update(in, i);
}
while(q--){
ll o, a, b;
cin >> o >> a >> b;
if(o == 1){
ll u = query(a) - query(a - 1);
update(b - u, a);
}
else{
cout << query(b) - query(a - 1) << '\n';
}
}
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = 5e5 + 5;
int n, m, arr[N], dp[35][N];
void sparse_table(int n){
for(int i = 1;i <= 31;i++){
for(int j = 0;(j + (1LL << (i - 1))) < n;j++){
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j + (1LL << (i - 1))]);
}
}
}
int query(int l, int r){
int idx = __lg(r - l + 1);
return max(dp[idx][l], dp[idx][r - (1LL << idx) + 1]);
}
int main(){
IOS
cin >> n;
for(int i = 0;i < n;i++) cin >> arr[i];
cin >> m;
for(int i = 0;i < n;i++) dp[0][i] = arr[i];
sparse_table(n);
while(m--){
int l, r;
cin >> l >> r;
if(l > r) swap(l, r);
l--, r--;
cout << query(l, r) << '\n';
}
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
ll mod = 1000000007;
ll fast_pow(int base, int exp){
ll res = 1;
while(exp > 0){
if(exp & 1) res = res * base % mod;
base = base * base % mod;
exp >>= 1;
}
return res;
}
int main(){
IOS
int base = 3, exp = 15;
cout << fast_pow(base, exp) << '\n';
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll mod = 1000000007;
struct Matrix{
ll mat[2][2] = {{0}};
Matrix operator * (Matrix &inp){
Matrix tmp;
for(int i = 0;i < 2;i++){
for(int j = 0;j < 2;j++){
for(int k = 0;k < 2;k++){
tmp.mat[i][j] = ((tmp.mat[i][j] + (mat[i][k] % mod) * (inp.mat[k][j] % mod)) % mod) % mod;
}
}
}
return tmp;
}
};
Matrix base;
Matrix fast_pow(int exp){
if(exp == 1) return base;
if(exp % 2 == 0){
Matrix res = fast_pow(exp >> 1);
return res * res;
}
Matrix res = fast_pow(exp >> 1);
return base * res * res;
}
int main(){
IOS
base.mat[0][0] = 1;
base.mat[0][1] = 4;
base.mat[1][0] = 2;
base.mat[1][1] = 3;
Matrix output = fast_pow(10);
for(int i = 0;i < 2;i++){
for(int j = 0;j < 2;j++){
cout << output.mat[i][j] << ' ';
}
cout << '\n';
}
return 0;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll mod = 1000000007;
struct Matrix{
ll mat[2][2] = {{0}};
Matrix operator * (Matrix &inp){
Matrix tmp;
for(int i = 0;i < 2;i++){
for(int j = 0;j < 2;j++){
for(int k = 0;k < 2;k++){
tmp.mat[i][j] = ((tmp.mat[i][j] + (mat[i][k] % mod) * (inp.mat[k][j] % mod)) % mod) % mod;
}
}
}
return tmp;
}
};
Matrix base;
Matrix fast_pow(int n){
if(n == 1) return base;
if(n % 2 == 0){
Matrix res = fast_pow(n >> 1);
return res * res;
}
Matrix res = fast_pow(n >> 1);
return base * res * res;
}
int main(){
IOS
base.mat[0][0] = 1;
base.mat[0][1] = 1;
base.mat[1][0] = 1;
base.mat[1][1] = 0;
Matrix output = fast_pow(20);
cout << output.mat[0][0] << '\n';
return 0;
}
int n=1000; //假設共有n個點
int dsu[1000]; //建一個紀錄集合編號的陣列,若dsu[n]==n,代表為根
///初始化集合
void initt(){
for(int i=0;i<=n;i++){
//初始每個集合只有自己
dsu[i]=i;
}
}
///查詢
//傳入要找尋的目標
int findd(int x){
if(x!=dsu[x]){
//往上尋找祖先,再遞迴更新路上遇到的節點
dsu[x]=Find(dsu[x]);
}
return dsu[x];
}
///合併
void unionn(int x,int y){
int a=findd(x);
int b=findd(y);
//若集合編號不相同,則進行合併,
if(a!=b){
dsu[a]=b;
}
}
while(getline(ss,str,'m'))//以m分割
cout << str << endl;
int a,b; char c;
while(ss>>a>>c>>b)//處理像是-2/9+9/7
cout<<a<<" "<<c<<" "<<b<<endl;
//輸出 -2 / 9 endl 9 / 7
// 01 backpack
for(int i=1;i<=n;i++){
for(int j=x;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
//無限背包
for(int i=1;i<=W;i++){ // 從小到大遍歷重量
for(int j=1;j<=n;j++){ // 遍歷每個物品
if(i>=w[j]) dp[i]=max(dp[i],dp[i-w[j]]+v[j]);
}
}
//拓鋪
int N, M, u, v, deg[MAXN]; // deg[i] 紀錄點 i 被連入邊數
vector<int> edge[MAXN];
/*------ 1. 計算 indegree ------*/
cin >> N >> M;
while(M--)
{
cin >> u >> v;
edge[u].push_back(v);
++deg[v];
}
/*------ 2. 將 indegree 為 0 的點放入 queue 中 ------*/
queue<int> q; // 紀錄待拔點
for(int i = 0; i < N; ++i)
if(deg[i] == 0)
q.push(i);
/*------ 3. 重複拔點,直到 queue 清空 ------*/
while(!q.empty())
{
int cur = q.front(); q.pop();
cout << cur << "\n";
for(int i: edge[cur])
{
--deg[i]; // 3-1. 相連點 indgree 減一
if(deg[i] == 0) q.push(i); // 3-2. 若該點 indgree 減至 0,則放入 queue 中
}
}
// when the number is too large, use powl instead of pow
// will provide you more accuracy.
powl(a,b)
(int)round(p,(1.0/n)) //nth root of p
// will return address of iterator, call result as *iterator;
iterator find(iterator first, iterator last, const T&value);
bool binary_search(iterator first, iterator last, const T &value);
// a^b mod p
long powmod(long base, long exp , long modulus){
base %= modulus;
long result = 1;
while(exp > 0){
if(exp & 1) result = (result * base) % modulus;
base = (base * base) % modulus;
exp >> 1;
}
return result;
}
// n! mod p
int factmod(int n,int p){
long long res = 1;
while(n > 1){
res = (res % powmod(p-1 , n/p , p)) %p;
for(int i=2;i<=n%p;i++)
res = (res * i) % p;
n /= p;
}
}
// n >=m choose m number from 1 ~ n
void combination(int n, int m){
if (n<m) return;
int a[50] = {0};
int k = 0;
for(int i=1;i<=m;i++) a[i] = i;
while(1){
for(int i=1;i<=m;i++)
cout << a[i] << " ";
cout << endl;
k = m;
while((k>0) && (n-a[k] == m-k)) k --;
if(k == 0) break;
a[k] ++;
for(int i=k+1;i<=m;i++){
a[i] = a[i-1] + 1;
}
}
}
string num = "0123456789ABCDE";
int mToTen(string n, int m){
int multi = 1;
int result = 0;
for(int i = n.size() - 1;i >= 0;i--){
result += num.find(n[i]) * multi;
multi *= m;
}
return result;
}
#define MAXN 100 // largest n or m
long binomial_coefficient(n, m) // compute n choose m
int n, m;
{
int i, j;
long bc[MAXN][MAXN];
for(i = 0;i <= n;i++) bc[i][0] = 1;
for(j = 0;j <= n;j++) bc[j][j] = 1;
for(i = 1;i <= n;i++)
for(j = 1;j < i;j++)
bc[i][j] = bc[i - 1][j - 1] + bc[i - 1][j];
reutrn bc[n][m];
}
int a[100] = {0};
int b[100] = {0};
int f[100] = {0};
int n = 0, m = 0;
int main(void){
cin >> n;
for(int i = 1;i <= n;i++) cin >> a[i];
cin >> m;
for(int i = 1;i <= m;i++) cin >> b[i];
for(int i = 1;i <= n;i++){
int k = 0;
for(int j = 1;j <= m;j++){
if(a[i] > b[j] && f[j] > k) k = f[j];
else if(a[i] == b[j] && k + 1 > f[j]) f[j] = k + 1;
}
}
}
// 求 a 在模 m 下的模反元素,m 必須是質數
ll modInverse(ll a, ll m) {
ll res = 1, exp = m - 2;
while (exp > 0) {
if (exp % 2 == 1) res = (res * a) % m;
a = (a * a) % m;
exp /= 2;
}
return res;
}
ll extendedGCD(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
ll x1, y1;
ll g = extendedGCD(b, a % b, x1, y1);
x = y1;
y = x1 - (a / b) * y1;
return g;
}
ll chineseRemainder(vector<ll> &n, vector<ll> &a) {
ll prod = 1;
for (ll num : n) prod *= num; // Calculate the product of all moduli
ll result = 0;
for (int i = 0; i < n.size(); i++) {
ll p = prod / n[i]; // Product divided by current modulus
ll x, y;
extendedGCD(p, n[i], x, y); // Solve p * x ≡ 1 (mod n[i])
result = (result + a[i] * x * p) % prod; // Add current term to result
}
return (result + prod) % prod; // Return the result modulo the product
}
ll solveLinearCongruence(ll a, ll b, ll m) {
ll x, y;
ll g = extendedGCD(a, m, x, y); // Solve a * x + m * y = gcd(a, m)
if (b % g != 0) return -1; // No solution if gcd(a, m) does not divide b
x = (x * (b / g)) % m;
if (x < 0) x += m; // Ensure the result is positive
return x;
}
int n=1000; //假設共有n個點
int dsu[1000]; //建一個紀錄集合編號的陣列,若dsu[n]==n,代表為根
///初始化集合
void initt(){
for(int i=0;i<=n;i++){
//初始每個集合只有自己
dsu[i]=i;
}
}
///查詢
//傳入要找尋的目標
int findd(int x){
if(x!=dsu[x]){
//往上尋找祖先,再遞迴更新路上遇到的節點
dsu[x]=Find(dsu[x]);
}
return dsu[x];
}
///合併
void unionn(int x,int y){
int a=findd(x);
int b=findd(y);
//若集合編號不相同,則進行合併,
if(a!=b){
dsu[a]=b;
}
}
int Find(int a){
return (anc[a] == a ? a : anc[a] = Find(anc[a]));
}
bool merge(int a, int b){
a = Find(a);
b = Find(b);
if(a == b) return false;
if(sz[a] < sz[b]) swap(a, b);
anc[b] = a;
sz[a] += sz[b];
return true;
}
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int dp[205][2];
bool uni[205][2];
void dfs(vector<int> vec[205], int u){
dp[u][0] = 0;
dp[u][1] = 1;
uni[u][0] = 1;
uni[u][1] = 1;
for(auto v : vec[u]){
dfs(vec, v);
dp[u][1] += dp[v][0];
dp[u][0] += max(dp[v][0], dp[v][1]);
if(dp[v][0] > dp[v][1]){
if(!uni[v][0]) uni[u][0] = 0;
}
else if(dp[v][1] > dp[v][0]){
if(!uni[v][1]) uni[u][0] = 0;
}
if(dp[v][0] == dp[v][1]) uni[u][0] = 0;
if(!uni[v][0]) uni[u][1] = 0;
}
}
int main(){
IOS
int n;
while(cin >> n && n){
unordered_map<string, int> un;
vector<int> vec[205];
string boss;
cin >> boss;
int idx = 0;
un[boss] = idx++;
memset(uni, 1, sizeof(uni));
memset(dp, 0, sizeof(dp));
for(int i = 0;i < n - 1;i++){
string str1, str2;
cin >> str1 >> str2;
if(!un[str1]) un[str1] = idx++;
if(!un[str2]) un[str2] = idx++;
vec[un[str2]].push_back(un[str1]);
}
dfs(vec, un[boss]);
cout << max(dp[un[boss]][0], dp[un[boss]][1]) << ' ';
if(dp[un[boss]][0] == dp[un[boss]][1]){
cout << "No" << '\n';
}
else if(dp[un[boss]][0] > dp[un[boss]][1]){
cout << (uni[un[boss]][0] ? "Yes" : "No") << '\n';
}
else if(dp[un[boss]][1] > dp[un[boss]][0]){
cout << (uni[un[boss]][1] ? "Yes" : "No") << '\n';
}
}
return 0;
}
setarch $(uname –machine) –addr-no-randomize /bin/bash
May 26, 2025When a hardware interrupt occurs, such as from a timer or I/O device, the CPU stops executing the current thread and traps into the kernel, entering the interrupt context to run the appropriate Interrupt Service Routine (ISR). While in this context, the system does not immediately resume the interrupted thread because the interrupt might have changed the overall system state—for example, it could have made another thread ready to run. Since the ISR executes outside of any specific thread's context, the kernel must wait until the interrupt is fully handled before invoking the scheduler to make a fair and informed decision about which thread should run next. This ensures that thread scheduling considers all updated states in the system, rather than blindly resuming the interrupted thread.
May 13, 2025image
Apr 20, 2025Timer Interrupt is a Non-Cooperative Approach to switch different process,
Mar 5, 2025or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up