div2 + div1 C题 思维 + 并查集 + 快速幂

C. Little Alawn’s Puzzle
读了好久才读懂啥意思,一共就两行,每次操作可以交换上下两个数
前提问题解决的条件是:每行都是一个排列,并且所有列没有相同的数
问加上当前的这一个情况,在交换之后也符合问题的解一共有多少个
分析:
根据样例2我们可以发现,如果要交换数字后保证还是一个排列,必须把属于同一个集合的所有列都进行交换,显然是一道并查集,寻找一共有 sum 个集合,对于每一个集合我们可以选择操作或不操作,就是求 2 的 sum 次方。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e5 + 9; 
const int mod = 1e9 + 7; 
int n, t, _;
ll a[3][N];
int f[N];
int find(int x)
{
	int r = x, j, k = x;
	while(f[r] != r) r = f[r];
	while(k != r)
	{
		j = f[k];
		f[k] = r;
		k = j;
	}
	return r;
}
ll q_power(ll a, ll n)
{
	ll ans = 1;
	while(n)
	{
		if(n & 1) ans  = (ans * a) % mod;
		n >>= 1;
		a = (a * a) % mod;
	}
	return ans;
}
void work()
{
	ll ans = 0;
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i) f[i] = i;	
	for(int i = 1; i <= 2; ++i)
		for(int j = 1; j <= n; ++j)
		{
			scanf("%d", &a[i][j]);
		}
	for(int i = 1; i <= n; ++i)
	{
		int xx = find(a[1][i]), yy = find(a[2][i]);
		if(xx != yy)
			f[xx] = yy;
	}
	for(int i = 1; i <= n; ++i)
		if(find(i) == i) ++ans;
	//cout << ans << endl;
	printf("%lld\n", q_power(2, ans));
}
int main()
{
	cin >> t;
	for(_ = 1; _ <= t; ++_)
		work();
	return 0;
}
/*
1 2 3
2 3 1
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的示例代码,演示如何使用React和TypeScript实现关键字模糊查询接口的联通。 首先,我们需要安装必要的依赖项。打开终端,进入项目目录,执行以下命令: ``` npm install react react-dom @types/react @types/react-dom axios @types/axios ``` 其中,`react`和`react-dom`是React框架的核心依赖,`@types/react`和`@types/react-dom`是React框架的TypeScript类型定义文件,`axios`是一个基于Promise的HTTP客户端,用于发送Ajax请求,`@types/axios`是axios库的TypeScript类型定义文件。 接下来,在项目中创建一个名为`SearchBox`的组件,用于输入关键字,并向服务器发送请求: ```tsx import React, { useState } from "react"; import axios from "axios"; type SearchResult = { id: number; name: string; description: string; }; const SearchBox: React.FC = () => { const [query, setQuery] = useState<string>(""); // 输入框的值 const [results, setResults] = useState<SearchResult[]>([]); // 搜索结果 const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => { setQuery(event.target.value); }; const handleSearch = async () => { const response = await axios.get<SearchResult[]>( `/api/search?q=${encodeURIComponent(query)}` ); setResults(response.data); }; return ( <div> <input type="text" value={query} onChange={handleInputChange} /> <button onClick={handleSearch}>搜索</button> <ul> {results.map((result) => ( <li key={result.id}> <h3>{result.name}</h3> <p>{result.description}</p> </li> ))} </ul> </div> ); }; export default SearchBox; ``` 在上面的代码中,我们定义了一个名为`SearchBox`的函数式组件,它包含一个输入框、一个搜索按钮和一个无序列表。当用户输入关键字并点击搜索按钮时,`handleSearch`函数将会发送一个GET请求到`/api/search`接口,并将查询字符串作为参数传递给服务器。服务器将返回一个JSON数组,包含匹配的搜索结果。我们使用`axios`库发送请求并处理响应。一旦收到响应,我们将搜索结果存储在`results`状态中,并使用`map`函数将它们渲染到无序列表中。 现在,让我们在项目中创建一个名为`server.ts`的文件,用于模拟服务器端的行为: ```ts import express from "express"; type SearchResult = { id: number; name: string; description: string; }; const data: SearchResult[] = [ { id: 1, name: "JavaScript", description: "一门流行的脚本语言", }, { id: 2, name: "TypeScript", description: "JavaScript的超集,具有强类型和面向对象的特性", }, { id: 3, name: "React", description: "一款流行的前端UI框架", }, { id: 4, name: "Angular", description: "一款流行的前端框架", }, ]; const app = express(); app.get("/api/search", (req, res) => { const q = req.query.q as string; const results = data.filter((item) => item.name.toLowerCase().includes(q.toLowerCase()) ); res.json(results); }); const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`Server is listening on port ${port}`); }); ``` 在上面的代码中,我们使用`express`库创建了一个名为`app`的Web应用程序,它包含一个GET路由,用于处理`/api/search`请求。当收到请求后,服务器将会读取查询字符串中的`q`参数,并使用`filter`函数从`data`数组中过滤出匹配的结果。最后,服务器将结果作为JSON响应发送回客户端。在这个示例中,我们使用了一个静态的搜索结果,实际应用中,我们可以使用数据库或其他数据源来进行搜索。 最后,在项目中的`index.tsx`文件中,我们可以渲染`SearchBox`组件: ```tsx import React from "react"; import ReactDOM from "react-dom"; import SearchBox from "./SearchBox"; ReactDOM.render(<SearchBox />, document.getElementById("root")); ``` 现在,我们可以启动应用程序并测试搜索功能了。在终端中执行以下命令: ``` npm start ``` 打开浏览器,访问`http://localhost:3000`,输入关键字并点击搜索按钮,即可看到匹配的搜索结果。 这就是使用React和TypeScript实现关键字模糊查询接口的联通的示例代码。希望能对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值